c++ - fork 并执行许多不同的进程,并从每个进程中获取结果

标签 c++ linux ipc exec fork

我已经设法从我的应用程序中派生并执行了一个不同的程序。我目前正在研究如何等待从 exec 调用的进程通过管道或标准输出返回结果。但是,我可以使用一个 fork 来拥有一组进程,还是我必须 fork 多次并再次调用同一个程序?我可以获得每个不同进程的 PID 吗?我希望我的应用程序调用我当前多次调用但具有不同参数的同一程序:我希望同一程序的一组 8 个进程运行并通过管道返回结果。有人可以给我指出正确的方向吗?我浏览了 linux.die 的手册页,但它们的描述相当简陋和晦涩。我可以找到电子书或 pdf 以获取详细信息吗?谢谢!

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控制哪个 child (根据参数xml文件)获得了哪个结果(通过管道或标准输出),并据此采取行动?我是否必须将子进程封装在一个对象中并从那里开始工作,或者我可以将它们一起分组吗?

最佳答案

一次 Fork 系统调用只生成一个新进程(一个 PID)。您应该组织一些数据结构(例如 pids 数组、父级管道末端数组等),从主程序执行 8 个 fork(每个子程序都会执行 exec),然后等待子程序。

在每次 fork() 之后,它将返回一个 child 的 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 */

关于c++ - fork 并执行许多不同的进程,并从每个进程中获取结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5982094/

相关文章:

android - 不同语言的两个进程是否可以使用UDP进行通信

c++ - 为什么他们更喜欢此代码段中的动态调度

c++ - itoa() 的安全对应物?

linux - linux ssd + hdd上的文件访问

linux - 当我在LINUX中有一组10列5行的数据时,如何找到第2列中奇数/偶数行的平均值

Ruby - fork 进程上的 set_trace_func

linux - 为什么 sendto() a Unix domain datagram socket (`socket(PF_FILE, SOCK_DGRAM, 0)` ) 返回 EPERM?

c++ - 模板运算符重载

c++ - 从 wxString 转换为 double 时,小数位被解释为零

linux - RHEL 6.3(64 位): Install a package to a specific version of php