【发布时间】:2018-12-02 14:57:50
【问题描述】:
我正在研究 Linux 中的信号,并试图了解进程的机制。我写了这段代码:
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
void filsFini(int sig){
printf("The Child finished\n");
}
int main(){
pid_t pid;
system("clear");
if((pid=fork())==0){
printf("Child in a break\n");
for(;;);
}
printf("The father %d \n",getpid());
system("ps -lH");
(void) signal(SIGCHLD,filsFini);
printf("hit a button to end\n");
getchar();
kill(pid,SIGINT);
system("ps -lH");
waitpid(pid,NULL,0);
system("ps -lH");
return EXIT_SUCCESS;
}
最后我得到了这个结果,我有一个问题是printf("Child finished\n");被写了两次我怎样才能避免这种情况?
【问题讨论】:
-
我没有看到任何打印 Child finished 的代码...也许你有另一个版本?
-
它在函数 filsFini 中,我用作信号 SIGCHLD 的处理程序
-
OK,所以任务是检查只有子进程只处理一次信号调用。也许你可以在 filsFini 中使用一个静态变量,初始值为 0。第一次调用后加 1,那么下次调用不打印?
-
也许..但我想知道它被调用两次的原因..因为孩子会变成僵尸,一旦孩子死了,它就会向父亲发送一个 SIGCHLD,所以它应该只被调用曾经..我认为 waitpid 是原因,但我还没有看到它