fifo: 解除对未决电话的屏蔽

问题描述 投票:1回答:3

我使用一个FIFO(命名为管道)进行IPC。现在进程A调用

  • mkfifo(path)
  • open(path)

自然 open() 现在我需要一种方法来使FIFO无效。因此我调用

  • unlink(path)

现在,我预计,任何阻挡 open 呼叫会返回,但他们没有,我的进程无限期地挂起。

我怎样才能解除对 open 当FIFO被取消链接时,我是否必须求助于 O_NONBLOCK?

PS:我试过建议的writeunlinkclose方法,无果。我试过了建议的写unlinkclose的方法,但无济于事。open 立即调用块。

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

我认为问题在于

FIFO必须在两端(读和写)打开,才能传递数据。通常情况下,打开FIFO块,直到另一端也被打开。

然而 invalidate 应该在不知道FIFO当前是否被打开读取的情况下工作。

c macos posix mkfifo
3个回答
1
投票

无效器应该在非阻塞写模式下打开FIFO。这样,它对 open() 如果没有读者等待,就不会挂起。它就应该立即关闭FIFO。

当FIFO被打开时,任何在只读打开中等待的进程都会返回。然后他们会立即读取EOF。

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

1
投票

打开FIFO进行写入。unlink 然后关闭它。这将使过程A的 open 成功,由此产生的FD将立即处于EOF。顺便说一下 unlink 如果你只是想让 open 返回,但仍然是一个清理的好主意)。)


1
投票

在Linux上,你可以(非移植地)在 O_RDWR 模式。当你做并保持FIFO的时候,其他的开放者不会被阻塞在他们的 open 调用(不管这些调用是只读还是只写的开放调用)。然后,你可以解除FIFO的链接,同时仍然保持着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;
}
© www.soinside.com 2019 - 2024. All rights reserved.