【问题标题】:SIGSTOP not working in c programSIGSTOP 在 c 程序中不起作用
【发布时间】: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/…

标签: c linux process signals


【解决方案1】:

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

信号SIGKILLSIGSTOP 不能被捕获、阻止或忽略。

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


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

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

【讨论】:

    猜你喜欢
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    相关资源
    最近更新 更多