2010-09-08 69 views

回答

2

我不能确定没有检查,但如果发送的信号不是SIGTERM(或可能是SIGKILL,但对CDT有点不友好),我会感到惊讶。

至于子流程,取决于他们实际在做什么。如果他们通过管道与他们的父进程进行通信(以任何方式,包括读取它们的stdout),他们可能会发现那些文件描述符关闭或进入异常状态;如果他们尝试使用fds,他们将被发送一个SIGPIPE。那里可能还有一个SIGHUP。

如果一个子流程真的完全不相交(关闭所有打开的FD,父母中没有可能告诉它退出的SIGTERM处理程序),那么它理论上可以继续运行。这就是守护进程如何产生的。

0

我用终止按钮检查了SIGTERM,SIGHUP,SIGPIPE。不工作... 我想这是SIGKILL,这让我很伤心!另外,我没有找到一个从外部(或内置插件)控制台运行程序的好解决方案。

0

它似乎是SIGKILL。 GDB使用SIGSTOP来停止/恢复。从signal手册页:

信号SIGKILL和SIGSTOP不能被捕获或忽略。

我试着用eclipse调试下面的程序。在运行会话中按terminate或调试会话中的pause不会打印任何内容。因此它必须是SIGKILLSIGSTOP

#include <signal.h> 
#include <string.h> 
#include <unistd.h> 

void handler(int sig) { 
    printf("\nsig:%2d %s\n", sig, strsignal(sig)); 
} 

int main(int argc, char **argv) { 
    int signum; 
    int delay; 

    if (argc < 2) { 
     printf("usage: continue <sleep>\n"); 
     return 1; 
    } 

    delay = atoi(argv[1]); 

    for (signum = 1; signum < 64; signum++) { 
     signal(signum, handler); 
    } 

    printf("sleeping %d s\n", delay); 
    for(;;) { 
     sleep(delay); 
    } 

    return 0; 
} 
相关问题