0

我有一个 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 文件已被删除。

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

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

4

1 回答 1

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
}

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

于 2013-09-05T18:43:38.760 回答