在子shell中的背景中使用Bash运行命令

时间:2018-05-30 22:02:58

标签: c++ bash process subprocess subshell

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

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

我试过了:

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

但没有任何改变。

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

  

disown:无法操作子shell中的作业

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

我甚至尝试过创建一个可以自我控制的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;
}

但是在运行之后,意识到因为我fork而不是separate_from_parent_and_let_parent_die子shell仍将等待进程结束。

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

有没有办法不进行fork而是与c ++程序中的父进程分开,以便它可以在没有后果的情况下死掉或强制命令与bash中的子shell分开?

优选后者。

2 个答案:

答案 0 :(得分:3)

<div class="watch"> <div class="face"> <div class="numbers"></div> <div class="hands"> <div class="hand hand-hour"></div> <div class="hand hand-minute"></div> <div class="hand hand-second"> </div> </div> </div> </div>命令替换机制等待子shell的$(...)所连接的管道上的EOF。因此,即使您在子shell中使用命令,主shell仍将等待它完成并关闭其stdout。为避免等待,您需要将其输出重定向远离管道。

stdout

答案 1 :(得分:2)

我希望我能帮到你。如果我错了,请修复我 - 你希望你的主线程能够在子线程结束之前死掉吗? 我知道你可以在线程上使用detach方法。