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