创建2个子进程
Create 2 child processes
我必须在3个进程之间创建这种通信:
-
1进程(父进程):
- 向子节点1发送偶数;
- 向子节点2发送不均匀的数字;
- 获取子1和子2发送的数字
-
2个子进程1:
- 从父节点获得偶数;
- 向子节点2发送偶数;
- 发送2*value_of_number给父
-
3进程(子进程2):
- 从父端获得不均匀的数字;
- 发送2*value_of_number给父
这是我的代码:
int main()
{
int p12[2],p13[2],p23[2];
int p21[2],p31[2];
if(pipe(p12)<0){
perror("pipe 12 errorn");
exit(1);
}
if(pipe(p13)<0){
perror("pipe 13 errorn");
exit(1);
}
if(pipe(p23)<0){
perror("pipe 23 errorn");
exit(1);
}
if(pipe(p21)<0){
perror("pipe 21 errorn");
exit(1);
}
if(pipe(p31)<0){
perror("pipe 31 errorn");
exit(1);
}
switch(fork()){
case -1:{
perror("fork 1 errorn");
exit(1);
}
case 0:{//1 child
close(p12[1]);
close(p13[1]);
close(p13[0]);
close(p23[0]);
close(p21[0]);
close(p31[1]);
close(p31[0]);
int paros;
int ket;
while(read(p12[0],&paros,sizeof(int))>0){
cout<<"2: "<<paros<<endl;
if(write(p23[1],&paros,sizeof(int))==-1){
perror("write 23 errorn");
exit(1);
}
ket=2*paros;
if(write(p21[1],&ket,sizeof(int))==-1){
perror("write 21 errorn");
exit(1);
}
}
close(p21[1]);
close(p12[0]);
close(p23[1]);
exit(0);
}
default:{
switch(fork()){
case -1:{
perror("fork 2 errorn");
exit(1);
}
case 0:{//2 child
close(p13[1]);
close(p12[1]);
close(p12[0]);
close(p23[1]);
close(p31[0]);
close(p21[1]);
close(p21[0]);
int szamok;
int ket;
while(read(p13[0],&szamok,sizeof(int))>0){
cout<<"3: "<<szamok<<endl;
ket=2*szamok;
if(write(p31[1],&ket,sizeof(int))==-1){
perror("write 31 errorn");
exit(1);
}
}
while(read(p23[0],&szamok,sizeof(int))>0){
cout<<"3: "<<szamok<<endl;
}
close(p31[1]);
close(p13[0]);
close(p23[0]);
exit(0);
}
default:{
close(p12[0]);
close(p13[0]);
close(p23[0]);
close(p23[1]);
close(p21[1]);
close(p31[1]);
}
}
}
}
int i=1;
while(i<=10){
if(i%2==0){
if(write(p12[1],&i,sizeof(int))==-1){
perror("write 12 errorn");
exit(1);
}
}
else{
if(write(p13[1],&i,sizeof(int))==-1){
perror("write 13 errorn");
exit(1);
}
}
i++;
}
int szam;
while(read(p21[0],&szam,sizeof(int))>0){
cout<<"1: "<<szam<<endl;
}
while(read(p31[0],&szam,sizeof(int))>0){
cout<<"1: "<<szam<<endl;
}
close(p12[1]);
close(p13[1]);
close(p31[0]);
close(p21[0]);
while(wait(NULL)>0){};
exit(0);
}
父进程在每个管道中写入5个数字,然后等待子进程1的所有响应,然后再转到子进程2。在给子进程写完数字之后,你不会关闭这些管道,所以那些子进程不知道父进程已经停止了。在子进程1的情况下,它仍在等待从父进程接收更多的数字。正因为如此,它永远不会关闭自己的管道并退出。因此,父进程被卡在它从子进程1开始的第一个读循环中,永远无法到达子进程2。
在写入p12[1]和p13[1]后,加入
close(p12[1]);
close(p13[1]);
,过程将运行到完成
相关文章:
- 终止 QProcess 不会终止子进程
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 子进程更新共享 mmap 内存,但父进程没有更改
- 使用 waitpid 时等待子进程终止
- 使用重定向标准处理子进程中的 kbhit
- 由 JOB 中的进程启动的子进程是否可以将 JOB 属性设置为脱离作业?
- 是否可以将子进程的 stdout 重定向到父进程中的另一个文件?
- kill() 总是返回 0(成功),即使在子进程已经结束之后?
- 父进程和子进程之间的 POSIX 信号量
- 检测到由于操作系统内存不足而导致子进程终止
- 使用system()创建独立的子进程
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 在 Bash 脚本中处理来自子进程的信号
- 不明确的错误重载运算符<<QdataStream 子类和个人类
- Qt C++ - 如何成功将数据传递给子进程?
- C++ 窗口本地系统模拟在子进程中失败
- 将类型化数组写入子进程 stdin 无法正常工作
- 将 nodejs 脚本作为子进程执行(而不是从其他脚本执行)
- 使用信号检测子进程何时终止的最佳方法是什么?
- 具有多个客户端的套接字服务器.杀死子进程