为什么这个代码在到达管道时会停止运行?

时间:2014-10-08 17:56:03

标签: c++ fork pipe

当这个程序运行时,它会通过父节点循环,然后在写入管道时切换到子节点。在孩子中,读取的管道只会导致程序停止。

当前示例输出:

父母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]);
    }
}

当程序从孩子的管道线上读取时,程序结束。

1 个答案:

答案 0 :(得分:1)

在初始化管道之前,您的主要错误是fork()。因此父和子都有自己的私有(不通过fd继承共享)管道对pipeName,只有父管道用管道fds初始化pipeName2

对于父母来说,pipeName[0]后面没有数据可读。对于孩子......谁知道它在pipeName2[1]写的是什么?如果幸运的话,EBADF就失败了。

所以,首先pipe()两次,然后 fork(),看看是否有所改善。