为什么以下程序在第二次read
电话上没有阻止?
int pid = fork();
if(pid) {
int fifo = open("testfifo", O_RDWR);
char buf[20];
while(1) {
read(fifo, buf, 10);
puts(buf);
}
} else {
int fifo = open("testfifo", O_WRONLY);
write(fifo, "teststring", 10);
close(fifo);
}
return 0;
第二个read
调用会继续返回0
,即使fifo变为空,它应该在read
调用时阻止。
我错过了什么吗?
操作系统是Windows,管道已使用mknod testfifo p
创建。
答案 0 :(得分:4)
我从另一个stackoverflow问题中发现,我应该每次打开和关闭“服务器”管道,在这种情况下是父进程的管道;所以这是正确的代码:
int pid = fork();
if(pid) {
char buf[20];
while(1) {
int fifo = open("testfifo", O_RDWR);
read(fifo, buf, 15);
close(fifo);
puts(buf), fflush(stdout);
}
} else {
int fifo = open("testfifo", O_WRONLY);
write(fifo, "teststring", 15);
close(fifo);
}
答案 1 :(得分:0)
您没有关闭文件
编辑:删除了令人尴尬的事情。