子进程接收父级的SIGINT
我有一个使用Qt
Framework的简单程序。它使用QProcess执行RAR并压缩一些文件。在我的程序中,我正在捕获SIGINT
并在发生代码时做一些事情:
signal(SIGINT, &unix_handler);
当SIGINT
发生时,我检查RAR进程是否完成,如果不是,我将等待它……问题是(我认为)RAR进程也得到SIGINT
了我的程序所需要的,并且在压缩之前退出了所有的文件。
有没有一种方法可以运行RAR进程,以便SIGINT
在程序接收到它时不接收它?
谢谢
回答:
如果要在Unix系统上SIGINT
使用Ctrl
+ 生成with
C
,则信号将发送到整个进程组。
您需要使用setpgid或setid将子进程放入另一个进程组,以便它不会接收控制终端生成的信号。
[编辑:]
确保setpgid
仔细阅读页面的RATIONALE部分。在这里插入所有潜在的比赛条件有点棘手。
为了保证100%不会SIGINT
向您的子进程发送任何内容,您需要执行以下操作:
#define CHECK(x) if(!(x)) { perror(#x " failed"); abort(); /* or whatever */ }/* Block SIGINT. */
sigset_t mask, omask;
sigemptyset(&mask);
sigaddset(&mask, SIGINT);
CHECK(sigprocmask(SIG_BLOCK, &mask, &omask) == 0);
/* Spawn child. */
pid_t child_pid = fork();
CHECK(child_pid >= 0);
if (child_pid == 0) {
/* Child */
CHECK(setpgid(0, 0) == 0);
execl(...);
abort();
}
/* Parent */
if (setpgid(child_pid, child_pid) < 0 && errno != EACCES)
abort(); /* or whatever */
/* Unblock SIGINT */
CHECK(sigprocmask(SIG_SETMASK, &omask, NULL) == 0);
严格来说,这些步骤中的每一个都是必要的。您必须封锁讯号,以防使用者在拨打电话后立即按下Ctrl
+
。您必须召集孩子,以防万一在父母有时间做任何事情之前发生。您必须打电话给父母,以防 父母 奔跑而有人在_孩子_ 有时间做任何事情之前打+。C``fork``setpgid``execl``setpgid
上面的序列很笨拙,但确实可以处理100%的比赛条件。
以上是 子进程接收父级的SIGINT 的全部内容, 来源链接: utcz.com/qa/398251.html