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

10-04 12:19