c++ - Bash 在子 shell 中的后台运行命令

标签 c++ bash process subprocess subshell

我希望能够在子 shell 中 bg 进程,就好像它不在子 shell 中一样。

$( sleep 3 & ) 只是忽略了符号。

我试过:

$( sleep 3 & )
$( sleep 3 & ) &
$( sleep 3 ) &

但没有任何变化。

然后我尝试了返回的 $( disown sleep 3 & )

disown: can't manipulate jobs in subshell

这促使我尝试 $( set -m; disown sleep 3 & ) 但我得到了相同的输出。

我什至尝试创建一个可以 self 守护的 C++ 程序:

#include <unistd.h>
#include <chrono>
#include <thread>
using namespace std;

int main() {
    int ret = fork();
    if (ret < 0) return ret;  // fork error
    if (ret > 0) return 0;  // parent exits

    this_thread::sleep_for(chrono::milliseconds(3000));

    return 0;
}

但是在运行它之后,意识到因为我是 forking 而不是 separate_from_parent_and_let_parent_dieing 子 shell 仍然会等待进程结束。

为了跳出我的 MCVE,从子 shell 中调用了一个函数,在该函数中,我需要从服务器中提取数据并且需要在 bg 中运行。我唯一的限制是我无法在子 shell 中编辑函数调用。

有什么方法可以不 fork 而是与 C++ 程序中的父进程分离,这样它就可以死掉而不会产生任何后果,或者强制命令与 bash 中的子 shell 分离?

最好是后者。

最佳答案

$(...) 命令替换机制在子 shell 的 stdout 连接到的管道上等待 EOF。因此,即使您在子 shell 中后台执行命令,主 shell 仍会等待它完成并关闭其 stdout。为避免等待,您需要将其输出重定向到管道之外。

echo "$( cat file1; sleep 3 >/dev/null & cat file2 )"

关于c++ - Bash 在子 shell 中的后台运行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50613945/

相关文章:

c++ - 连接错误 : Invalid argument at sockets

linux - 在不换行的情况下将文本附加到文件

bash - 为什么 let --n 的退出代码与 bash 中的 let n-- 不同?

javascript - 参数传递如何与嵌套函数调用中的调用堆栈一起使用

linux - 进程如何在 Linux 中找到动态共享库?

c++ - Qt 如何将项目添加到具有偏移量的场景中?

c++ - 错误错误: ‘void*’ is not a pointer-to-object type

c - linux下 "size"命令的结果和text&edata&end的值不一样

c++ - 知道为什么下面的代码片段打印 2 而不是 3

bash - 检测是否安装了 homebrew 包