通过阻塞打开检测FIFO文件的删除

时间:2013-09-05 18:31:47

标签: 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,但它只是结束于“它意味着您的流程将永远悬挂”并且没有建议的解决方法......

1 个答案:

答案 0 :(得分:0)

我可以有这样的伪代码:

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
}

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