SIGSTOP不在c程序中工作

时间:2017-02-09 12:37:29

标签: c linux process signals

我正在尝试编写一个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");之前被调用。这是如何发生的,如何以正确的顺序输出?

1 个答案:

答案 0 :(得分:3)

如果你read the signal(7) manual page,你会看到

  

无法捕获,阻止或忽略信号SIGKILLSIGSTOP

你根本无法捕捉到这个信号。

最后一点,约"Killing child"以错误的顺序打印很容易修复:在您打印的字符串中添加一个尾随换行符。

这是因为输出到stdoutprintf写入的内容)默认为行缓冲。这意味着stdout的内部缓冲区在换行符上被刷新(即实际写入终端)。如果你没有换行符,那么当进程退出时,缓冲区将被刷新,这是在你退出子进程之后。