叉n个孩子并发一个字

时间:2016-06-22 08:03:09

标签: c++ linux pipe fork

我有一个任务,我必须创建n个孩子。父母将每个人发送一个单词。他们将修改它并打印它。我已经尝试为每个孩子创建管道然后每个人发一个字。但这是我的程序的输出:

1 child begins
2 child begins
1 child ends
3 child begins
4 child begins
2 child ends
5 child begins
3 child ends
4 child ends
5 child ends
End parent

这是我的计划:

int main()
{
ifstream f("in.txt");
int n=5;//n children
int p[n][2];

for(int i=0;i<n;i++)
    if(pipe(p[i])<0){
        perror("pipe error");
        exit(1);
    }

for(int i=0;i<n;i++)
{
    pid_t pid=fork();
    if(pid<0){
        perror("fork error");
        exit(1);
    }
    if(pid==0){//i child

        for(int j=0;j<=i;j++)
            close(p[j][1]);

        char word[256];
        int size;

        cout<<i+1<<" child begins"<<endl;

        while(read(p[i][0],&size,sizeof(int))>0){//first I get the size of the word
            read(p[i][0],word,size*sizeof(char));//then the word
            word[i%(size-1)] = '-';//make some changes to it
            cout<<i+1<<"child "<<word<<endl;}   

        cout<<i+1<<" child ends"<<endl;
        exit(0);
    }
    if(pid>0){
        close(p[i][0]);
    }
}
char word[100];
int size;
int j=0;

while(f>>word){
    size=strlen(word);

    write(p[j][1],&size,sizeof(int));
    write(p[j][1],word,100);
    j++;
}

for(int i=0;i<n;i++)
    close(p[i][1]);

while(wait(NULL) > 0){};
cout<<"End parent"<<endl;
exit(0);
}

1 个答案:

答案 0 :(得分:1)

在您的原始帖子中,您错误地在父代码中写入管道的读取端。我看到你现在改变了这一点 - 相关的路线来自:

write(p[j][0],&size,sizeof(int));
write(p[j][0],word,100);

要:

write(p[j][1],&size,sizeof(int));
write(p[j][1],word,100);

另外,你的单词长度并没有真正做到正确。我推荐这些进一步的更改,因此在读取端出现的单词正确地以null结尾并且没有尾随垃圾:

write(p[j][1],&size,sizeof(int));
write(p[j][1],word,size+1);

我能够重新创建您的原始问题,并使用这些更改测试了代码,并且它可以正常运行。