【问题标题】:Signal sent to both child and parent process发送给子进程和父进程的信号
【发布时间】:2012-10-15 14:03:00
【问题描述】:

据我了解,发送给父进程的信号不应发送给子进程。那么在下面的示例中,为什么 SIGINT 会同时到达孩子和父母?

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>

void sigCatcher( int );

int main ( void ) {
    if (signal(SIGINT, sigCatcher) == SIG_ERR) {
        fprintf(stderr, "Couldn't register signal handler\n");
        exit(1);
    }
    if(fork() == 0) {
        char *argv[] = {"find","/",".",NULL};
        execvp("find",argv);
    }
    for (;;) {
        sleep(10);
        write(STDOUT_FILENO, "W\n",3);
    }

    return 0;
}

void sigCatcher( int theSignal ) {
        write(STDOUT_FILENO, "C\n",3);
}

【问题讨论】:

  • 当你执行 fork 时,你会完全复制运行命令的进程,并且由于信号方法在 fork 之前执行,因此子进程和父进程都会捕获信号。
  • 但是 exec 替换了所有代码,因此信号处理程序被覆盖。

标签: c unix signals


【解决方案1】:

如果您通过键入 ^-C 发送 SIGINT,则该信号将发送到前台处理组中的所有进程。如果您使用kill -2,它只会转到父进程(或您指定的任何进程。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多