猿问

关于 管道通信 的一个问题

下面是一个简单的例子:
#include
#include
#include
#include
#include
intmain()
{
intn,fd[2];
pid_tpid;
charbuffer[BUFSIZ+1];
if(pipe(fd)<0)
{
printf("pipefailed!\n");
exit(1);
}
if((pid=fork())<0)
{
printf("forkfailed!\n");
exit(1);
}
elseif(pid>0)
{
close(fd[0]);
inti;
char*words="Howareyou?";
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);
}
输出结果是:
Howareyou?Howareyou?Howareyou?Howareyou?Howareyou?---
希望的结果是:
Howareyou?---
Howareyou?---
Howareyou?---
Howareyou?---
Howareyou?---
为什么子进程只读了一次,而不是主进程每写一次读一次。
再问一点其他的,主进程跟子进程的执行速度是不一致的吧,会不会出现主进程写入的时候子进程还没有close(fd[0]);建立管道这种情况,是不是需要子进程向主进程应答一下表示我已经准备好了。
茅侃侃
浏览 323回答 2
2回答

至尊宝的传说

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

慕慕森

BUFSIZE改成strlen(“howareyou?”)的值父进程输出完之后还要memset(buffer,0,sizeof(buffer)),不然输出不对
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答