当前位置: 首页 > 面试题库 >

子进程接收父级的SIGINT

东方吕恭
2023-03-14
问题内容

我有一个使用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 Ctrl`` C

上面的序列很笨拙,但确实可以处理100%的比赛条件。



 类似资料:
  • 我在React中有一个名为“app”的父组件,它用HighCharts实现呈现一个“卡路里”子组件。 以下是我的完整代码: 谁能帮我做错了什么?

  • 我尝试使用C语言中的< code>fork()函数处理Linux中的多个进程,这是我的代码: 现在让我们假设父进程ID为100,两个子进程(p1, p2)ID为101 相反,我看到了一些不同的东西,两个子进程具有相同的PPID,但第一个进程具有与之不同的PID。这是我得到的示例输出: 我的问题是,两个子进程的父PID不应该是3383吗?希望有人能解释这一切在这里是如何运作的,以及我做错了什么(或想

  • 问题内容: 我正在使用child_process.spawn()从在Ubuntu上运行的Node.JS应用程序启动脚本。据我所知,标准的分叉或生成的* nix进程通常不会在父进程死后死亡,但是当从Node.JS生成进程时,它们似乎在我的应用程序崩溃或被ctrl-c等终止时被杀死。 。 为什么会这样,并且有解决办法?我似乎在child_process API中找不到任何明显的选项。 我的应用程序启动

  • 问题是要确定子数据的总和是否等于父数据。如果是,返回真,否则返回假。 下面是我的代码,在提交时出现错误。我知道这是一个简单的问题,但在编写了条件之后,我很难通过遍历所有左右节点来递归检查二叉树中每个节点的和条件。 请指导我,因为我哪里做错了。

  • 问题内容: 是否可以从Shell脚本中的父进程ID获取子进程ID? 我有一个要使用Shell脚本执行的文件,这会导致一个新进程 process1 (父进程)。这个 过程1 已经分叉的另一个进程 过程2 (子进程)。使用脚本,我可以使用以下命令获取 process1 的pid : 但我无法获取子进程的pid。 问题答案: 只需使用:

  • 是否可以从外壳脚本中的父进程ID获取子进程ID? 我有一个要使用shell脚本执行的文件,这会导致一个新的进程process1(父进程)。此进程1已经派生了另一个进程process2(子进程)。使用脚本,我可以使用以下命令获得进程1的pid: 但是我无法获取子进程的pid。