Linxu下父子进程通道输出问题C/C++ code#include stdio.h#include stdlib.h#include unistd.h#inclu
Linxu下父子进程通道输出问题
C/C++ code#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <errno.h>int main(){ printf("3"); int pipe_fd[2]; int pid; char buf[100]; int r_num; memset(buf,0,sizeof(buf)); printf("1"); if(pipe(pipe_fd) < 0) { printf("pipe create error\n"); return -1; } if((pid = fork()) == -1) printf("fork error"); else if (pid == 0) { close(pipe_fd[1]); sleep(2); if((r_num = read(pipe_fd[0],buf,100)) > 0) { printf("putout %d char is %s",r_num,buf); } close(pipe_fd[0]); exit(0); } else { printf("2"); close(pipe_fd[0]); if(write(pipe_fd[1],"Hello",5) != -1) printf("putin Hello"); sleep(4); wait(); exit(0); } pause(); }
运行结果:
[root@localhost wang]# gcc -o ww 4-1.c
[root@localhost wang]# ./ww
312putin Hello
31putout 5 char is Hello
[root@localhost wang]#
问题:
1、子进程应该是从fork处开始运行,为什么31会被输出两次?
2、父进程先像管道内写入,应该先输出putout 5 char is Hello才对,为什么是子进程先输出?
小白问题,烦请大牛告知。
[解决办法]问题:
1、子进程应该是从fork处开始运行,为什么31会被输出两次?
第一题我感觉应该是,你printf没有清缓存,所以在fock的时候,这个缓存区的内容被子进程进程了,所以会有两个31出现,你换成printf(“1\n”)这样带有\n的应该就不会出现两次的情况了。
2、父进程先像管道内写入,应该先输出putout 5 char is Hello才对,为什么是子进程先输出?
第二题,父进程先向管道写东西,然后就执行紧接着的语句了啊,
if(write(pipe_fd[1],"Hello",5) != -1)
printf("putin Hello");
当父进程sleep的时候,cpu调用了子进程, printf("putout %d char is %s",r_num,buf);
所以说是父进程先输出的,不存在问题啊
[解决办法]stdout默认是行缓冲的,而行缓冲遇到'\n'才会清理缓存,把缓存中的东西打印到屏幕上(或者行缓存满了),
我也是知道的东西也不是很深,比较浅显,所以推荐你看下这个博客
(转载)
http://blog.csdn.net/footman_/article/details/7163666
还是不是很明白的话就搜索下行缓冲的知识吧,共同学习!