我想有些信號會被髮送到進程。一些還是一個?如果他們出現多於一個的順序?如果按下Terminate按鈕,在Linux上的Eclipse CDT中會發生什麼?
如果按下「終止」按鈕並且進程已分叉,會發生什麼情況? 如果進程已通過系統啓動其他進程(...)會發生什麼情況?
我想有些信號會被髮送到進程。一些還是一個?如果他們出現多於一個的順序?如果按下Terminate按鈕,在Linux上的Eclipse CDT中會發生什麼?
如果按下「終止」按鈕並且進程已分叉,會發生什麼情況? 如果進程已通過系統啓動其他進程(...)會發生什麼情況?
我不能確定沒有檢查,但如果發送的信號不是SIGTERM(或可能是SIGKILL,但對CDT有點不友好),我會感到驚訝。
至於子流程,取決於他們實際在做什麼。如果他們通過管道與他們的父進程進行通信(以任何方式,包括讀取它們的stdout),他們可能會發現那些文件描述符關閉或進入異常狀態;如果他們嘗試使用fds,他們將被髮送一個SIGPIPE。那裏可能還有一個SIGHUP。
如果一個子流程真的完全不相交(關閉所有打開的FD,父母中沒有可能告訴它退出的SIGTERM處理程序),那麼它理論上可以繼續運行。這就是守護進程如何產生的。
我用終止按鈕檢查了SIGTERM,SIGHUP,SIGPIPE。不工作... 我想這是SIGKILL,這讓我很傷心!另外,我沒有找到一個從外部(或內置插件)控制檯運行程序的好解決方案。
它似乎是SIGKILL。 GDB使用SIGSTOP來停止/恢復。從signal
手冊頁:
信號SIGKILL和SIGSTOP不能被捕獲或忽略。
我試着用eclipse調試下面的程序。在運行會話中按terminate
或調試會話中的pause
不會打印任何內容。因此它必須是SIGKILL
或SIGSTOP
。
#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;
}