我有一个 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/