2010-09-08 68 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; 
} 
相關問題