Æle*_*lex 3 c++ linux fork ipc exec
我已经设法从我的应用程序中分叉并执行不同的程序.我正在研究如何等待从exec调用的进程通过管道或stdout返回结果.但是,我可以使用单个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;
}
Run Code Online (Sandbox Code Playgroud)
例如,我如何通过PID控制哪个子(根据参数xml文件)获得了哪个结果(通过管道或标准输出),从而采取相应的行动?我是否必须将子进程封装在一个对象中,然后从那里开始工作,还是可以将它们组合在一起?
一个Fork系统调用只进行一个新进程(一个PID).你应该组织一些数据结构(例如pids数组,管道的父端数组等),从主程序中做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 */
Run Code Online (Sandbox Code Playgroud)
一开始它是令人费解的,但是当你调用fork()时,你似乎已经意识到了这一点:
调用进程("父")基本上由操作系统复制,并且复制进程成为具有唯一PID的"子";
从fork()调用返回的值可以是:整数0,1,意味着节目接收的0返回是"子"; 或者是分叉子的非零整数PID; 和
新的子进程被输入调度队列以供执行.父节点保留在调度队列中,并继续像以前一样执行.
从fork()返回这个(0 .xor.非0)告诉程序它在这个时刻正在播放哪个角色 - 0返回,程序是子进程; 返回的任何其他内容,程序是父进程.
如果播放父角色的程序需要很多孩子,他必须分别fork()每个孩子; 没有多个孩子共享fork()这样的东西.
中间结果当然可以通过管道发送.
至于用不同的参数调用每个孩子,实际上没有什么特别的事情要做:你可以确定,当孩子获得控制权时,他将拥有与父母完全相同的变量(副本).因此,向孩子传达参数是父母设置他希望孩子操作的变量值的问题; 然后调用fork().
1更准确:fork()返回一个type值pid_t,这几天与很多系统上的整数相同.
| 归档时间: |
|
| 查看次数: |
5089 次 |
| 最近记录: |