我想有些信号会被发送到进程。一些还是一个?如果他们出现多于一个的顺序?如果按下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;
}