![](/img/trans.png)
[英]What is the use of ignoring `SIGCHLD` signal with `sigaction(2)`?
[英]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.