我使用一个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当前是否被打开读取的情况下工作。
无效器应该在非阻塞写模式下打开FIFO。这样,它对 open()
如果没有读者等待,就不会挂起。它就应该立即关闭FIFO。
当FIFO被打开时,任何在只读打开中等待的进程都会返回。然后他们会立即读取EOF。
void invalidate() {
int fd = open(path, O_WRONLY | O_NONBLOCK);
unlink(path);
close(fd);
}
打开FIFO进行写入。unlink
然后关闭它。这将使过程A的 open
成功,由此产生的FD将立即处于EOF。顺便说一下 unlink
如果你只是想让 open
返回,但仍然是一个清理的好主意)。)
在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;
}