有人可以帮助我逐步完成以下 C 代码以了解输出应该是什么。
int x = 0;
pid_t pid;
int flag=1;
void handler1(int sig) {
x=x+1;
printf("%d\n",x);
fflush(stdout);
exit(0);
}
void handler2(int sig) {
x = x + 2;
flag = 0;
waitpid(-1,NULL, 0);
}
int main() {
signal(SIGUSR1, handler1);
signal(SIGCHLD, handler2);
printf("%d\n",x);
fflush(stdout);
if ((pid = fork()) == 0) {
while(1) {};
}
kill(pid, SIGUSR1);
while(flag) {};
printf("%d\n",x);
fflush(stdout);
exit(0);
}
我认为输出应该是“213”,但我不确定。
最佳答案
从技术上讲,它是未定义的,因为您使用信号处理程序中的stdio函数。我将用单个 write
替换 printf
/fflush
组合(但实际刷新流的奖励点)。从信号处理程序退出也被认为是不好的形式。
Also, both x
and flag
need to be made volatile
.
- 首先发生的事情是打印
x
,但它的值仍然是0
。 - 然后,该进程被
fork()
ed。 SIGUSR1
被传递给子级,并在其中调用处理程序。处理程序在子进程内递增x
,并打印1
。- 子进程退出,并调用父进程的
SIGCHLD
处理程序,将父进程的x
副本(仍为 0)增加 2。 - 父级退出循环轮询
flag
,并打印当前值2
。
所以输出应该是012
。
关于c - C 中的 fork 和信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23533424/