首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

Linxu上父子进程通道输出有关问题

2012-07-08 
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

还是不是很明白的话就搜索下行缓冲的知识吧,共同学习!

热点排行