大家好,在使用 fork 和 signal 进行一些实验时,我遇到了一个表现出非常有趣的行为的程序,但经过几个小时的努力,我无法弄清楚发生了什么。
我想做的是我在主体内创建一个子进程,然后打印“hello world”,然后调用exit。在此之后,它的信号处理程序将被调用,并且被等待系统调用阻塞的父进程也将被调用。现在我在信号处理程序中创建另一个进程,但从那里开始,输出变为无限。
输出如下: Hello world Come to Linux Come to UNIX Come to Linux Come to UNIX Come to Linux Come to UNIX ...
又何必来Linux一再印。
另外请告诉我什么时候调用 fork,我知道重复的地址空间是由父级组成的,但是信号处理程序呢。他们是否也会重复。在我的情况下,当孩子调用退出时。然后被调用的信号处理程序是子级或父级的。
请帮忙。谢谢。
void sig_handler(int signo)
{
if(fork() == 0){
}
else{
int pid = 0;
wait(&pid);
printf("Come to unix");
fflush(stdout);
}
}
int main()
{
if (signal(SIGCHLD, sig_handler) == SIG_ERR){
}
int child_pid;
int i;
child_pid = fork();
switch (child_pid) {
case -1:
perror("fork");
exit(1);
case 0:
printf("hello world\n");fflush(stdout);
exit(0);
default:
wait(&i);
printf("Come to linux");
exit(0);
//break;
}
return 0;
}