我被要求在这个问题中找到所有可能的输出:
#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循环吗?
以及编译和运行此代码需要哪些必要的库?
答案 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应该是可能的,因为多个信号可以折叠为一个信号。