我正在尝试理解C中的管道。我已经构建了两个应该正常工作的测试程序,但在运行时,第二个打印未初始化的字符而不是预期的字符串。我有什么明显的遗失吗?
int main()
{
int parentToChild[2]; //1 Write
int childToParent[2]; //0 Read
pipe(parentToChild);
pipe(childToParent);
int parent = fork();
if(!parent)
{
close(parentToChild[1]);
close(childToParent[0]);
dup2(1,childToParent[1]); //sets child's stdout to send to parent
dup2(0,parentToChild[0]); //sets child's stdin to come from parent
execl("./program","./program",NULL);
}
close(childToParent[1]);
close(parentToChild[0]);
FILE* readin = fdopen(childToParent[0],"r");
FILE* writeto = fdopen(parentToChild[1],"w");
fprintf(writeto,"msg\n");
fflush(writeto);
return 0;
}
int main()
{ //The child process
fprintf(stderr,"Program started\n");
char buff[1024];
fgets(buff,1024,stdin);
fprintf(stderr,"%s",buff);
}
答案 0 :(得分:1)
问题在于:
dup2(1,childToParent[1]); // Error!
dup2(0,parentToChild[0]); // Error!
切换dup2调用中文件描述符的顺序。要修复代码,您必须通过以下方式更改这些行:
dup2(childToParent[1],1); //sets child's stdout to send to parent
dup2(parentToChild[0],0); //sets child's stdin to come from parent
dup2(new_fd,old_fd)使 newe fd 成为旧fd 参数的副本。有关详细信息,请查看dup2的手册页。
注意:我通过引入上述更改来测试您的代码,现在它正常运行。