关于 管道通信 的一个问题

下面是一个简单的例子:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

int main()
{
    int n, fd[2];
    pid_t pid;
    char buffer[BUFSIZ+1];
    if(pipe(fd)<0)
    {
        printf("pipe failed!\n ");
        exit(1);
    }
    if((pid=fork())<0)
    {
        printf("fork failed!\n ");
        exit(1);
    }
    else if (pid>0)
    {
        close(fd[0]);
        int i;
        char *words = "How are you?";
        sleep(1);
        for(i=0; i< 5; i++){ 
            write(fd[1], words, strlen(words));
        }
    }
    else
    {
        close(fd[1]);
        while((n=read(fd[0],buffer,BUFSIZ)) > 0){
            strcat(buffer, "---\n");
            write(STDOUT_FILENO,buffer,strlen(buffer));
        }
    }
    exit(0);
}   

输出结果是:
How are you?How are you?How are you?How are you?How are you?---
希望的结果是:
How are you?---
How are you?---
How are you?---
How are you?---
How are you?---
为什么 子进程 只读了一次,而不是 主进程 每写一次读一次 。

再问一点其他的,主进程 跟 子进程 的执行速度是 不一致的吧 ,会不会出现 主进程 写入的时候 子进程 还没有 close(fd[0]); 建立管道 这种情况 , 是不是 需要 子进程向主进程应答一下 表示我已经准备好了 。

阅读 3.3k
2 个回答

(1)你子进程一次读BUFSIZ个字节,可能出现的情况就是父进程把5个"how are you?"都写到管道里了,这时子进程才开始读,但你一次读BUFSIZ个字节,一次就把5个"how are you?"都读出来了。
(2)管道在pipe(fd)时就已经建立好了!

BUFSIZE改成strlen(“how are you?”)的值
父进程输出完之后还要memset(buffer,0,sizeof(buffer)),不然输出不对

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进