【发布时间】:2017-02-09 12:37:28
【问题描述】:
我正在尝试编写一个 C 程序,其中父进程暂停子进程并在几秒钟后继续执行它。
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
void sigstop();
void sigcont();
void sigquit();
int main()
{
int pid;
if ((pid = fork()) < 0) {
perror("fork");
exit(1);
}
if (pid == 0)
{ /* child */
signal(SIGSTOP,sigstop);
signal(SIGCONT,sigcont);
signal(SIGQUIT, sigquit);
for(;;); /* loop for ever */
}
else {
printf("\nPARENT: sending SIGSTOP to suspend the process\n\n");
kill(pid, SIGSTOP);
sleep(5);
printf("\nPARENT: sending SIGCONT to continue the suspended process\n\n");
kill(pid, SIGCONT);
sleep(5);
printf("killing child");
kill(pid,SIGQUIT);
sleep(5);
}
}
void sigstop()
{
printf("CHILD: I've been suspended\n");
}
void sigcont()
{
printf("CHILD: I'm back\n");
}
void sigquit()
{
printf("My DADDY has Killed me!!!\n");
exit(0);
}
sigstop() 内部的printf 永远不会被执行,sigquit() 在printf("killing child"); 之前被调用。这是怎么发生的,我怎样才能以正确的顺序获得输出?
【问题讨论】:
-
SIGQUIT不会杀死进程。那将是SIGKILL。 -
在信号处理程序中调用
printf()会调用未定义的行为。只有异步信号安全函数可以从信号处理程序中安全调用:行为未定义...如果信号处理程序调用本标准中定义的任何函数,而不是下表中列出的函数之一。见pubs.opengroup.org/onlinepubs/9699919799/functions/…