我有一个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,但它只是结束于“它意味着您的流程将永远悬挂”并且没有建议的解决方法......
答案 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
}
您还可以添加一个计数器来限制重试次数。