c++ - Linux下如何用C++创建进程?

标签 c++ process multiprocessing

我想通过调用可执行文件来创建一个进程,就像 popen 所允许的那样。但我不想通过管道与它实际通信:我想控制它,例如向那里发送信号或查明进程是否正在运行,在发送 SIGINT 后等待它完成,并且等等,就像Python中的multiprocessing一样。像这样:

pid_t A = create_process('foo');
pid_t B = create_process('bar');

join(B); // wait for B to return
send_signal(A, SIGINT);

正确的做法是什么?

用例例如:

  • 监控一堆进程(例如在崩溃时重新启动它们)

更新

我看到了答案的走向:fork()。然后我想修改我的用例:我想创建一个类,它在构造函数中接受一个字符串,并指定如下:实例化一个对象时,启动一个(子)进程(并由类的实例),当调用析构函数时,进程会收到终止信号,一旦进程返回,析构函数也会立即返回。

现在的用例:在升压状态图中,进入状态时启动进程,并在离开状态时发送终止。我猜,http://www.highscore.de/boost/process/process/tutorials.html#process.tutorials.start_child是最接近我正在寻找的东西,除了它似乎已经过时了。

这难道不能以非侵入性的方式实现吗?也许我有一个根本性的误解,并且有更好的方法来完成此类工作,如果是这样,我很高兴得到一些提示。

更新2

感谢下面的答案,我想我有了一些想法。我认为,这个例子会打印“This is main”三次,一次为“parent”,一次为每个 fork() – 但这是错误的。所以:谢谢您的耐心解答!

#include <iostream>
#include <string>

#include <unistd.h>

struct myclass
{
    pid_t the_pid;
    myclass(std::string the_call)
    {
        the_pid = fork();
        if(the_pid == 0)
        {
            execl(the_call.c_str(), NULL);
        }
    }
};

int main( int argc, char** argv )
{
    std::cout << "This is main" << std::endl;
    myclass("trivial_process");
    myclass("trivial_process");
}

最佳答案

下面的代码根本不是现实的代码,但它给了你一些想法。

pid_t pid = fork()
if (pid == 0) {
  // this is child process
  execl("foo", "foo", NULL);
}
// continue your code in the main process.

关于c++ - Linux下如何用C++创建进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12304949/

相关文章:

c++ - 可变仿函数是否仍然是 "valid"被使用

c++ - 查明文件路径是映射/远程还是本地

python - 如何为 Windows 重写这个多处理代码?

c++ - 无法访问链表的相邻节点

python - 导出 32 位枚举时 Boost Python 1.48 失败

android - 如何查看哪些唤醒锁处于 Activity 状态

java - 使用 Java 运行时添加注册表项,导致进程 reg.exe 永远运行

unix - 如何在 Haskell 中终止(SIGINT)子进程?

python multiprocessing,管理器启动进程生成循环

python - multiprocessing.Manager().Queue() 可以处理复杂对象吗?