我正在尝试编写一个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);
}
printf
内的sigstop()
永远不会被执行,而sigquit()
会在printf("killing child");
之前被调用。这是如何发生的,如何以正确的顺序输出?
答案 0 :(得分:3)
如果你read the signal(7)
manual page,你会看到
无法捕获,阻止或忽略信号
SIGKILL
和SIGSTOP
。
你根本无法捕捉到这个信号。
最后一点,约"Killing child"
以错误的顺序打印很容易修复:在您打印的字符串中添加一个尾随换行符。
这是因为输出到stdout
(printf
写入的内容)默认为行缓冲。这意味着stdout
的内部缓冲区在换行符上被刷新(即实际写入终端)。如果你没有换行符,那么当进程退出时,缓冲区将被刷新,这是在你退出子进程之后。