管道输出问题

spgoal 2003-01-08 12:50:23
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#define MAXLINE 20
int main()
{
int n1,n2,fd[2];
pid_t pid;
char line[MAXLINE];
char line2[MAXLINE];
if(pipe(fd)<0)
printf("pipe error");
if((pid=fork())<0)
printf("fork error");
else if(pid>0){ //parent
write(fd[1],"how are you?\n",MAXLINE);

wait();
n1=read(fd[0],line2,MAXLINE);
write(STDOUT_FILENO,line2,n1);
}else{
//close(fd[1]);
n2=read(fd[0],line,MAXLINE);
write(STDOUT_FILENO,line2,n2);

write(fd[1],"fine,thanks\n",MAXLINE);

}
exit(0);
}
输出怎么会这样?
?慷褸4k@怈fine,thanks
...全文
35 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
spgoal 2003-01-08
  • 打赏
  • 举报
回复
OK了,再按第三条修改,结果没问题
不用两个管道
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#define MAXLINE 20
int main()
{
int n1,n2,fd[2];
pid_t pid;
char line[MAXLINE];
if(pipe(fd)<0)
printf("pipe error");
if((pid=fork())<0)
printf("fork error");
else if(pid>0){ //parent
write(fd[1],"how are you?\n",13);
printf("parent waiting child\n");
wait();
n1=read(fd[0],line,MAXLINE);
write(STDOUT_FILENO,line,n1);
}else{
n2=read(fd[0],line,MAXLINE);
write(STDOUT_FILENO,line,n2);
write(fd[1],"fine,thanks\n",12);

}
exit(0);
}
//运行结果:
parent waiting child
how are you?
fine,thanks
wwwunix 2003-01-08
  • 打赏
  • 举报
回复
对,是半双工的。
spgoal 2003-01-08
  • 打赏
  • 举报
回复
谢谢,我按你的第二条改了,结果没乱码了,但会重复
how are you?
fine,tfine,thanks
spgoal 2003-01-08
  • 打赏
  • 举报
回复
pipe是半双工的,不是单工的吧
wwwunix 2003-01-08
  • 打赏
  • 举报
回复
正确答案:
1、pipe是单工机制的,对于你写的pipe你只能从父进程写,从子进程读。
2、write(STDOUT_FILENO,line2,n2);要改为write(STDOUT_FILENO,line,n2);
3、write时不要用MAXLINE,这样将会往PIPE中写入一些无用的数据(乱码)。这个参数要用实际的值。
4、要实现父子进程间的通讯,你可以用两个PIPE。
wwwunix 2003-01-08
  • 打赏
  • 举报
回复
上面的错了。
wwwunix 2003-01-08
  • 打赏
  • 举报
回复
pipe是单工机制的,对于你写的pipe你只能从子进程写,从父进程读。

23,124

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧