我想通过调用可执行文件来创建一个进程,就像 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/