Signal和SIGCHLD,它做什么?

时间:2012-12-09 23:16:21

标签: c signals fork

我被要求在这个问题中找到所有可能的输出:

#define N 4
int val = 9;
void handler(sig) {
   val += 3;
   return;
}
int main() {
  pid_t pid;
  int i;
  signal(SIGCHLD,handler);
  for (i=0;i<N;i++) {
    if ((pid =fork()) == 0) {
        val -= 3;
        exit(0);
    }
  }
  for (i=0;i<N;i++) {
    waitpid(-1,NULL,0);
  }
  printf("val = %d\n",val);
}

我不知道线路信号(SIGCHLD,处理程序)的作用。我只发现了以下内容:

SIGABRT - abnormal termination.
SIGFPE - floating point exception.
SIGILL - invalid instruction.
SIGINT - interactive attention request sent to the program.
SIGSEGV - invalid memory access.
SIGTERM - termination request sent to the program.

SIGCHLD做什么?你也可以在这个问题中解释for循环吗?

以及编译和运行此代码需要哪些必要的库?

3 个答案:

答案 0 :(得分:3)

从父进程派生子进程时,会设置SIGCHLD但不执行处理函数。 子进程退出后,它会使SIGCHLD跳闸,从而导致处理函数中的代码执行...

答案 1 :(得分:1)

奇怪的节目。

我认为我试图向您展示SIGCHLD导致的内容以及子进程中的变量如何被子进程更改,对父进程没有影响。

当你fork()时,你创建了一个子进程。听起来有点熟?父进程(调用fork()的进程)接收信号。处理程序已执行。当你运行该程序时,你应该看到21。

这是因为每次执行信号处理程序9 +(3 * 4)= 21时,val增加3。 该代码创建了四个孩子。

子进程

val - = 3;     出口(0);

递减val。但是因为这发生在另一个进程中,而不是原始子进程,所以它没有触及“原始”val变量,因为它有自己的本地副本。

答案 2 :(得分:0)

我相信@jim mcnamara的答案不会列出所有可能的输出。

9+(3 * k)等于1 <= k <= 4应该是可能的,因为多个信号可以折叠为一个信号。