这是一小段代码,父进程写管道和子读取管道,在父进程中添加'wait()'之前一切正常。我认为它应该没有区别,但它只是在我输入时卡住了。我对系统编程很陌生。任何人都可以帮忙吗?
int main() {
char* msg = malloc(sizeof(100));
int fd[2];
pipe(fd);
int status;
if (fork()!=0){
close(fd[0]);
dup2(fd[1],1);
scanf("%s",msg);
puts(msg);
wait(&status);
}
else {
char* buf = malloc(sizeof(100));
close(fd[1]);
dup2(fd[0],0);
scanf("%s",buf);
puts(buf);
}
return 0;}
答案 0 :(得分:1)
您忘记在父母fd[1]
电话后关闭dup2
。此外,您需要编写一些字符,使scanf
知道它已读取字符串的结尾。在致电puts
后关闭stdout将是一种方式。
答案 1 :(得分:0)
您应该在advanced unix programming上阅读一本好书,学会使用poll(2)(或select
,或pselect
或ppoll
)等多重调用,可能学会使用SIGCHLD。请注意,signal处理程序只能调用一组非常有限的函数(异步安全函数),并且通常应设置volatile sig_atomic_t
变量。
答案 2 :(得分:0)
在致电stdout
之前,您必须先刷新wait()
。
你的程序在没有wait()
的情况下工作,因为在父进程退出时完成了隐式刷新。