我想通过调用可执行文件来创建一个进程,就像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”三次,一次为“父”,一次为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");
}
答案 0 :(得分:3)
以下根本不是一个现实的代码,但它会给你一些想法。
pid_t pid = fork()
if (pid == 0) {
// this is child process
execl("foo", "foo", NULL);
}
// continue your code in the main process.
答案 1 :(得分:1)
使用之前发布的代码,试试这个:
#include <signal.h>
#include <unistd.h>
class MyProc
{
public:
MyProc( const std::string& cmd)
{
m_pid = fork()
if (pid == 0) {
execl(cmd.c_str(), cmd.c_str(), NULL);
}
}
~MyProc()
{
// Just for the case, we have 0, we do not want to kill ourself
if( m_pid > 0 )
{
kill(m_pid, SIGKILL);
wait(m_pid);
}
}
private:
pid_t m_pid;
}
我在这个例子中看到的缺点是,你不能确定,如果发出信号,过程已经完成(可能他不会),因为操作系统会在杀死后立即继续,其他过程可能会让它延迟。 为了确保这一点,你可以使用ps ...与pid的grep,这应该适用。
编辑:我添加了等待,在那里发表了评论!
答案 2 :(得分:0)
了解fork()
(man 2 fork
)