分叉和执行许多不同的过程,并从每一个获得结果

我设法从我的应用程序中分叉执行一个不同的程序。 我目前正在研究如何等待从exec调用的进程通过pipe道或标准输出返回结果。 但是,我可以使用单个分支还是一组进程,还是必须多次分叉并再次调用相同的程序? 我可以为每个不同的过程获得PID吗? 我希望我的应用程序调用我目前多次调用的同一个程序,但使用不同的参数:我想要一组同一程序的8个进程运行,并通过pipe道返回结果。 请有人指点我正确的方向吗? 我已经浏览了linux.die手册页,但是它们在描述中相当简陋而且含糊不清。 有没有电子书或pdf我可以find详细信息? 谢谢!

pid_t pID = fork(); if (pID == 0){ int proc = execl(BOLDAGENT,BOLDAGENT,"-u","2","-c","walkevo.xml",NULL); std::cout << strerror(errno) << std::endl; } 

例如,我怎样才能通过PID控制哪个子(根据参数xml文件)得到了哪个结果(通过pipe或者stdout),并据此采取行动? 我是否必须将subprocess封装在一个对象中,并从那里开始工作,还是可以将它们完全分组?

一个Fork系统调用只有一个新的过程(一个PID)。 你应该组织一些数据结构(例如pid数组,父节点管道数组等),从主程序中做8个fork(每个孩子都会执行exec )然后等待孩子。

在每个fork()之后,它将返回一个孩子的PID。 你可以存储这个pid和像这样的相关信息:

 #define MAX_CHILD=8 pid_t pids[MAX_CHILD]; int pipe_fd[MAX_CHILD]; for(int child=0;child<MAX_CHILD;child++) { int pipe[2]; /* create a pipe; save one of pipe fd to the pipe_fd[child] */ int ret; ret = fork(); if(ret) { /* parent */ /* close alien half of pipe */ pids[child] = ret; /* save the pid */ } else { /* child */ /* close alien half of pipe */ /* We are child #child, exec needed program */ exec(...); /* here can be no more code in the child, as `exec` will not return if there is no error! */ } } /* there you can do a `select` to wait data from several pipes; select will give you number of fd with data waiting, you can find a pid from two arrays */ 

起初,这是心灵的弯曲,但你似乎知道,当你调用fork()时:

  • 调用过程(“父”)基本上被操作系统复制,并且复制过程成为拥有唯一PID的“子”

  • 从fork()调用返回的值是:integer 0,1意味着接收0返回的程序是“child”; 或者是分叉子的非零整数PID; 和

  • 新的子进程被输入到调度队列中执行。 父级保持在调度队列中,并继续像以前一样执行。

从fork()返回这个(0 .xor。非0),它告诉程序在这个时刻它正在播放哪个角色 – 返回0,程序是子进程; 别的什么都返回了,程序就是父进程。

如果扮演父母角色的节目需要许多孩子,他必须分开分开每一个; 没有多个孩子共享一个fork()。

中间结果当然可以通过管道发送。

至于用不同的参数来调用每个孩子,没有什么特别的事情可以做:可以确定的是,当孩子得到控制时,他将会得到(副本)与父母完全相同的变量。 因此,将参数传递给孩子是父母设置他希望孩子操作的变量值的问题; 然后调用fork()。


1更准确的说:fork()返回一个类型为pid_t的值,这些日子在很多系统上都是一样的。

我从事C / C ++工作已经有一段时间了,但还有几点:

  • Wikipedia fork-exec页面提供了一个了解分叉和放弃的起点。 Google也是你的朋友。

  • 正如osgx的回答所说,fork()只能给你一个子进程,所以你必须调用它8次才能获得8个进程,然后每个进程都必须执行另一个程序。

  • fork()将子进程的PID返回给主进程,将0返回给子进程,因此您应该可以执行如下操作:

 int pid = fork(); if (pid == 0) { /* exec new program here */ } else { /* continue with parent process stuff */ }