如果要在Unix系统上
SIGINT使用
Ctrl+ 生成with
C,则信号将发送到整个进程组。
您需要使用setpgid或setid将子进程放入另一个进程组,以便它不会接收控制终端生成的信号。
[编辑:]
确保
setpgid仔细阅读页面的RATIONALE部分。在这里插入所有潜在的比赛条件有点棘手。
为了保证100%不会
SIGINT向您的子进程发送任何内容,您需要执行以下操作:
#define CHECK(x) if(!(x)) { perror(#x " failed"); abort(); }sigset_t mask, omask;sigemptyset(&mask);sigaddset(&mask, SIGINT);CHECK(sigprocmask(SIG_BLOCK, &mask, &omask) == 0);pid_t child_pid = fork();CHECK(child_pid >= 0);if (child_pid == 0) { CHECK(setpgid(0, 0) == 0); execl(...); abort();}if (setpgid(child_pid, child_pid) < 0 && errno != EACCES) abort(); CHECK(sigprocmask(SIG_SETMASK, &omask, NULL) == 0);严格来说,这些步骤中的每一个都是必要的。您必须封锁讯号,以防使用者在拨打电话后立即按下
Ctrl+
。您必须召集孩子,以防万一在父母有时间做任何事情之前发生。您必须打电话给父母,以防 父母 奔跑而有人在_孩子_ 有时间做任何事情之前打+。
C``fork``setpgid``execl``setpgid
Ctrl`` C
上面的序列很笨拙,但确实可以处理100%的比赛条件。



