当这个程序运行时,它会通过父节点循环,然后在写入管道时切换到子节点。在孩子中,读取的管道只会导致程序停止。
当前示例输出:
父母4741 14087(预计还有5行时只有这一行)
预期输出(随机生成的数字):
父母4741 14087
儿童4740 47082
父母4741 11345
Child 4740 99017
父母4741 96744
Child 4740 98653 (当给出变量3并且最后一个数字是随机生成的数字时)
#include <stdio.h>
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <ctime>
using namespace std;
int main (int argc, char *argv[]) {
int pid = fork(), temp, randNum, count, pipeName[2], pipeName2[2];
string conver;
pipe(pipeName);
conver = argv[1];
temp = atoi(conver.c_str());
char letter;
if (pid == 0) { //child
srand((unsigned)time(NULL) * getpid() );
//closing unused pipes
close(pipeName2[1]);
close(pipeName[0]);
//loop to switch between processes
for(int i=0; i<temp; i++) {
count = read(pipeName2[0], &letter, 20);
randNum = rand();
cout << "Child " << getpid() << " " << randNum << endl;
write(pipeName[1], "x", 1);
}
close(pipeName2[0]);
close(pipeName[1]);
}
else { //parent
srand((unsigned)time(NULL) * getpid() );
pipe(pipeName2);
//closing unused pipes
close(pipeName2[0]);
close(pipeName[1]);
//loop to switch between processes
for(int i=0; i<temp; i++) {
if(i != 0)
count = read(pipeName[0], &letter, 20);
randNum = rand();
cout << "Parent " << getpid() << " " << randNum << endl;
write(pipeName2[1], "x", 1);
}
close(pipeName[0]);
close(pipeName2[1]);
}
}
当程序从孩子的管道线上读取时,程序结束。
答案 0 :(得分:1)
在初始化管道之前,您的主要错误是fork()
。因此父和子都有自己的私有(不通过fd继承共享)管道对pipeName
,只有父管道用管道fds初始化pipeName2
。
对于父母来说,pipeName[0]
后面没有数据可读。对于孩子......谁知道它在pipeName2[1]
写的是什么?如果幸运的话,EBADF就失败了。
所以,首先pipe()
两次,然后 fork()
,看看是否有所改善。