代码之家  ›  专栏  ›  技术社区  ›  robsch YaakovHatam

如果您按下Terminate按钮,那么在Linux上的Eclipse CDT中会发生什么?

  •  2
  • robsch YaakovHatam  · 技术社区  · 14 年前

    我想一些信号会被发送到进程中。一些还是一个?如果发生的顺序不止一个?

    如果按下终止按钮,如果进程已经分叉,会发生什么? 如果进程按系统(…)启动了其他进程,会发生什么情况?

    3 回复  |  直到 14 年前
        1
  •  2
  •   crazyscot    14 年前

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

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

    如果子进程真的完全不相交(关闭所有打开的FDs,没有父进程中的SIGTHONER处理程序,它可能告诉它退出),那么理论上可以继续运行。这就是生成守护进程的方式。

        2
  •  0
  •   Geka P    10 年前

    我检查了SIGTERM,SIGHUP,SIGPIPE和terminate按钮。不起作用。。。 我想是西格基尔,这让我很难过!另外,我没有找到从外部(或内置插件)控制台运行程序的好解决方案。

        3
  •  0
  •   m-ric    10 年前

    好像是西格基尔。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;
    }