【发布时间】:2016-12-09 17:31:59
【问题描述】:
我试图让两个进程在 C 中协作。为此,我使用pause() 和用户信号,据我所知,pause() 导致程序休眠,直到收到信号。我正在这样做:
pid_t child = fork();
if(child < 0) {
perror("Fork error");
exit(1);
}
else if (child > 0) { //parent process
//do something here, then:
printf("Parent pausing\n");
pause();
printf("parent received sigusr2\n");
//do something
kill(child, SIGUSR2);
printf("Sent signal to child\n");
sleep(1);
fflush(NULL);
pause();
kill(child,SIGTERM);
waitpid(child, &status, 0);
}
else { //child process
//do something, then
printf("Child sending sigusr2\n");
kill(getppid(), SIGUSR2);
printf("Child pausing\n");
pause();
//do something
kill(getppid(), SIGUSR2);
fflush(NULL);
printf(frompipe);
pause();
}
(这可能有问题在我展示的具体问题之后,还没有在编码中到达那里)。所以我目前的输出是:
Parent pausing
Child sending sigusr2
Child pausing
User-defined signal 2
它就停在那里,好像父进程不会收到信号(因为它不打印parent received sigusr2)。程序终止,但一个进程卡在后台。我究竟做错了什么?
【问题讨论】:
-
你有这些信号的信号处理器吗?来自
man pause:pause() 导致调用进程(或线程)休眠,直到发出终止进程或导致调用信号捕获函数的信号。 -
从同一个手册页中,
sigsuspend(2)可能值得一看。 -
我以为
pause()自己捕捉到了信号……不是吗? -
man页面非常清晰,不是吗?