4

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

#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 循环?

我需要哪些必要的库来编译和运行这段代码?

4

3 回答 3

5

当您从父进程派生子进程时,会设置 SIGCHLD 但不会执行处理函数。子进程退出后,它触发 SIGCHLD 并因此导致处理函数中的代码执行......

于 2013-10-20T02:31:22.283 回答
3

奇怪的节目。

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

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

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

子进程

val -= 3;退出(0);

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

于 2012-12-10T02:10:26.663 回答
0

我相信@jim mcnamara 的回答没有列出所有可能的输出。

9+(3*k) for 1 <= k <= 4 应该是可能的,因为多个信号可以合并为一个。

于 2019-10-10T12:10:07.147 回答