c++ - 使 system() 产生的子进程在父进程收到终止信号并退出后继续运行

标签 c++ c linux node.js process

在 Linux/C++ 库中,我通过 system() 调用启动一个进程,

system("nohup processName > /dev/null&");

这似乎适用于一个自行退出的简单测试应用程序,但如果我从获取终止信号的 Nodejs/V8 扩展内部使用它,子进程将被终止。我确实发现在运行,

system("sudo nohup processName > /dev/null&");

通过将 sudoers 文件设置为不需要密码,即使父进程( Node )退出也能成功运行。有没有办法完全分 ionic 进程,以便发送给父进程和父进程退出的信号不再对子进程产生影响?最好在 system() 调用中,而不是需要获取进程 ID 并对其执行某些操作的东西。

最佳答案

从父进程分离的过程很简单:在setsid下运行命令(因此它在一个新 session 中启动),将标准输入、输出和错误重定向到/dev/null (或其他地方,视情况而定),在子 shell 的背景中。因为system()启动了一个新的shell,相当于这样一个子shell,所以

system("setsid COMMAND </dev/null >/dev/null 2>/dev/null &");

做的正是需要的。在 shell 脚本中,等价于

( setsid COMMAND </dev/null >/dev/null 2>/dev/null & )

(Shell 脚本需要一个子 shell,否则 COMMAND 将处于当前 shell 的作业控制之下。这在使用 system() 时并不重要,因为它无论如何都会为命令启动一个新的 shell;当命令退出时 shell 将退出。)

重定向是确保 COMMAND 没有打开当前终端的描述符所必需的。 (当终端关闭时,一个 TERM 信号被发送到所有这些进程。)这意味着标准输入、标准输出和标准错误都必须重定向。上述重定向在 Bash 和 POSIX shell 中都有效,但在旧版本的 /bin/sh 中可能无效。特别是,它应该适用于所有 Linux 发行版。

setsid 开始一个新的 session ; COMMAND 成为它自己的进程组的进程组组长。信号可以指向单个进程,也可以指向进程组中的所有进程。终止信号通常被发送到整个进程组(因为应用程序在技术上可能由多个相关进程组成)。如果父进程所属的进程组被进程组范围内的信号杀死,则启动新 session 可确保 COMMAND 不会被杀死。

关于c++ - 使 system() 产生的子进程在父进程收到终止信号并退出后继续运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12945189/

相关文章:

c++ - 通过 const 引用传递动态数组结构

c - 我在 C 中使用绝对值时遇到问题

c++ - main.cpp|45|错误: expected primary-expression before "int" and "double"

linux - 如何实现 ABA 解决方案?

python-3.x - Gnuradio可能的路径问题阻止使用python程序

c++ - 如何解决 "Undeclared identifier error" block 中的 "if"?

c++ - 以 C++ 元编程风格实现 RLE 算法

c++ - 在禁用 MSVC 语言扩展的情况下使用 Boost.Thread header

c - 使用指针类型转换时值发生莫名其妙的变化

php - 无法在 php 中使用 exec() 执行命令