FIFO不会在读取时阻塞

时间:2011-08-31 11:24:15

标签: c windows

为什么以下程序在第二次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创建。

2 个答案:

答案 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)

您没有关闭文件

编辑:删除了令人尴尬的事情。