我想通过调用可执行文件来创建一个进程,就像popen
允许的那样。但我不想通过管道与它实际通信:我想控制它,比如在那里发送信号或找出进程是否正在运行,发送后等待它完成SIGINT
等等,就像multiprocessing
在 Python 中一样. 像这样:
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”,一次打印给“父”,一次打印一次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");
}