fifo:取消阻止挂起的公开呼叫

fifo: Unblock pending open calls

我为 IPC 使用 FIFO(命名管道)。现在处理 A 调用

自然地 open() 将阻塞,直到文件被进程 B 写入。现在我需要一种使 FIFO 无效的方法。所以我叫

现在我预计任何阻塞 open 调用都会 return,但它们不会,我的进程无限期挂起。

当 FIFO 未链接时,如何解除对 open 调用的阻塞? 我必须求助于 O_NONBLOCK 吗?

PS:我尝试了建议的 write/unlink/close 方法但无济于事。 open 调用立即阻塞。

void invalidate() {
    int fd = open(path, O_WRONLY)
    unlink(path)
    close(fd)
}

我认为问题是

The FIFO must be opened on both ends (reading and writing) before data can be passed. Normally, opening the FIFO blocks until the other end is opened also.

但是 invalidate 应该可以在不知道 FIFO 当前是否打开进行读取的情况下工作。

打开FIFO进行写入,unlink,然后关闭。这将使进程 A 的 open 成功,并且生成的 FD 将立即处于 EOF。 (顺便说一下,如果你只想制作 open return,unlink 是不必要的,但对于清理仍然是个好主意。)

在 Linux 上,您可以(不可移植地)在 O_RDWR 模式下打开 FIFO。当您这样做并保持 FIFO 时,其他开场者不会在他们的 open 调用中被阻塞(无论这些是只读还是只写打开调用)。然后您可以取消链接 FIFO,同时仍然持有 O_RDWR 文件句柄。

示例代码:

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
int main(int C, char **V)
{
    int fd;
    if(0>(fd=open(V[1], O_RDWR))) return perror("open"),1;
    if(0>unlink(V[1])) return perror("unlink"),1;
}

无效程序应以非阻塞写入模式打开 FIFO。这样,如果没有读者在等待它,它对 open() 的调用就不会挂起。然后它应该立即关闭 FIFO。

任何在只读打开中等待的进程将在 FIFO 打开时 return。然后他们会立即读取 EOF。

void invalidate() {
    int fd = open(path, O_WRONLY | O_NONBLOCK);
    unlink(path);
    close(fd);
}