下面是一个简单的例子:
#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]); 建立管道 这种情况 , 是不是 需要 子进程向主进程应答一下 表示我已经准备好了 。
(1)你子进程一次读BUFSIZ个字节,可能出现的情况就是父进程把5个"how are you?"都写到管道里了,这时子进程才开始读,但你一次读BUFSIZ个字节,一次就把5个"how are you?"都读出来了。
(2)管道在
pipe(fd)
时就已经建立好了!