c - FIFO 不会在读取时阻塞

标签 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 创建的。

最佳答案

我从另一个 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);
}

关于c - FIFO 不会在读取时阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7256237/

相关文章:

c - 为什么这个程序没有给出预期的输出?

c - 如何从邻接矩阵构建邻接表?

objective-c - 如何将文本从 iOS 应用程序导出到台式电脑?

javascript - '文件名仅在外壳中与已包含的文件名不同'在具有相同外壳的相对路径上

c++ - CFileDialog 在调试器窗口中发布 "First-chance exception"

c - 表示地理表面地形图的二维数组算法

c - 将 char 传递给函数会破坏堆

c - 如何将 const char* 指针传递给 fts_open()

windows - 无法在 Windows 10 计算机中启动 'Spark History server'

windows - 创建 "fat"/"Universal"Windows DLL 在技术上是否可行?