c - 检测阻塞打开的 FIFO 文件的删除

标签 c bash named-pipes file-handling fifo

我有一个 C 文件,可以通过命名管道 (FIFO) 从 bash 脚本接收消息。 echo "abc">/tmp/fifo 将打开和关闭管道的写入端。因此,我从 C 中重复打开该文件,并且 open 的阻塞性质意味着 fopen 仅在将某些内容写入管道时才返回。代码看起来像这样:

while (1) {
    if (stat(fifo_path, &fifo_st) != 0) {
        perror("FIFO does not exist, exiting\n");
        exit(0)
    }

    fifo = fopen(fifo_path, "r");
    read = fgets(buf, 1024 * sizeof(char), fifo);

我的问题是 bash 脚本可能会删除该文件以表明它已完成通信,在这种情况下我必须进行一些清理。但是,当文件被删除时,fopen 不会返回(我认为这是预期的行为),因此我无法知道 FIFO 文件已被删除。

我想我可以有一个单独的线程来监视文件以检测文件何时被删除并进行清理,但这似乎是过度设计,我想知道是否有更好的方法?

编辑:问题已讨论here ,但它只是以“这意味着您的进程将永远挂起”结束,并且没有建议的解决方法...

最佳答案

我可以有这样的伪代码:

while (true) {
    if (stat(fifo_path, &fifo_st) != 0) {
        perror("FIFO does not exist, waiting for file\n");
    } else if ((fifo = fopen(fifo_path, "r")) == NULL) {
        perror("Unable to open the file, retrying later.\n");
    } else {
        read and do stuffs
        close fifo
        break from loop
    }
    sleep for some time
}

您还可以添加一个计数器来限制重试次数。

关于c - 检测阻塞打开的 FIFO 文件的删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18643486/

相关文章:

.net - Node.js 和 .net 之间的命名管道通信

c - 如何使用fgetc读取文件

ios - 对于非指针信号量,如何用 sem_open() 替换 sem_init() ?

bash - 文本文件中一行的非重复条目

linux - Shell 脚本 - 读取 Server#1 上的内容,在 Server#2 上进行处理

linux - 命名管道上的 tail -f 行为很奇怪

c++ - x86 上的竞争条件

c - 从同一目录杀死进程

python - IPython 3.5 返回 "bad interpreter: No such file or directory"

go - 如何在命名管道中的 EOF 后恢复读取