信号机制与同步的概念

请问这段代码怎样分析欸,请给我一个详细的运行过程描述。


#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<stdlib.h>
int i;
void intfun()
{
  i=0;
}
main()
{
   int k,j,pid;
   j=1;
   while((pid=fork())==-1);
   if(pid>0)
   {
      for(k=1;k<3;k++)
      {
         printf("how are you!\n");
         sleep(1);
      }
      kill(pid,17);
      wait(0);
      printf("Parent exited\n");
      exit(0);
   }
   else
   {
      signal(17,intfun);
      i=1;
      while(i==1)
      {
         printf("I am child: %d\n",j++);
         sleep(1);
      }
      printf("Child exited\n");
      exit(0);
   }
}

这段代码是一个经典的进程间通信的示例,主要利用了信号机制和进程同步的概念。下面是具体的运行过程描述:

1.首先,在主函数 main()中会调用 fork() 函数来创建一个子进程。

2.如果 fork() 函数返回值大于 0,说明当前进程为父进程。父进程会在循环中输出 "how are you!" 字符串,并且每个字符串之间间隔 1 秒钟。当循环执行两次后,父进程会向子进程发送一个信号,信号编号为 17。

3.子进程通过调用 signal() 函数来注册信号处理函数 intfun()。在子进程中,会不断输出 "I am child: %d" 的字符串,其中 %d 是递增的数字,每个字符串之间间隔 1 秒钟。

4.当子进程收到父进程发送的信号 17 后,会触发信号处理函数 intfun(),将变量 i 的值设置为 0。

5.在子进程中,由于 while(i==1) 循环条件不再满足,所以会退出循环,并输出 "Child exited" 的字符串。

6.在父进程中,由于调用了 wait(0) 函数,会等待子进程的退出状态,直到子进程退出后,才会输出 "Parent exited" 的字符串。

7.最后,整个程序结束。

总体来说,这段代码主要实现了父子进程之间的通信和同步。通过使用信号机制和进程同步的概念,父进程和子进程可以互相通信,并且在必要的时候进行同步操作。

这段代码是一个简单的父子进程通信的例子,主要使用了fork()函数创建子进程和kill()函数发送信号。

首先,在主函数中,通过fork()函数创建了一个子进程,并判断了fork()的返回值,如果返回值大于0,则说明是父进程,如果返回值等于0,则说明是子进程。

在父进程中,通过for循环输出了三次字符串“how are you!”,然后使用kill()函数向子进程发送了一个信号SIGSTOP(17),使子进程暂停执行。接着使用wait()函数等待子进程结束,并输出“Parent exited”,最后使用exit()函数退出程序。

在子进程中,首先使用signal()函数注册了一个信号处理函数intfun(),当接收到信号SIGSTOP时,会执行intfun()函数。然后使用一个while循环,不断输出“ I am child: %d”,并通过sleep()函数使子进程暂停1秒。当接收到父进程发送的信号SIGSTOP时,会执行intfun()函数,将i的值设为0,从而退出while循环。最后输出“Child exited”,并使用exit()函数退出程序。

总的来说,这段代码主要演示了父子进程之间的通信,父进程通过发送信号控制子进程的执行。