我已经设法从我的应用程序中分叉并执行一个不同的程序。我目前正在研究如何等待 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控制哪个子进程(根据参数xml文件)获得了哪个结果(通过管道或stdout),从而采取相应的行动?我是否必须将子进程封装在一个对象中,并从那里开始工作,或者我可以将它们组合在一起吗?
One Fork
syscall 只创建一个新进程(一个 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 */
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)