我有一个任务,我必须创建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);
}
答案 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);
我能够重新创建您的原始问题,并使用这些更改测试了代码,并且它可以正常运行。