繁体   English   中英

Signal和SIGCHLD,它有什么作用?

[英]Signal and SIGCHLD, what does it do?

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

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

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

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

奇怪的程序。

我想向您展示的是SIGCHLD导致的原因以及子进程更改子进程中的变量对父级没有影响。

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

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

子进程

val-= 3; 退出(0);

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM