清洗/冲洗命名管道

时间:2018-07-25 21:05:10

标签: python ipc named-pipes mkfifo

我创建FIFO在不相关的进程之间进行通信。在我的项目中,没有办法打破程序在其中运行的无限循环。因此,我无法unlink FIFO。

我认为,如果FIFO在编写器进程中预先存在,则可以删除并重新创建相同的名称。但是,如果读取器进程在写入进程有机会删除并重新创建它之前打开FIFO,该怎么办?在这方面,我可以使用sleep,但似乎效率不高。

此外,我还认为我可以暂停读取器进程,直到接收到来自写入器进程的信号,但读取器进程的PID未知。将它们视为两个单独且不同的bash脚本。操作系统启动后不久就开始执行。

  • 有没有一种方法可以清理/刷新FIFO?
  • open()用于打开FIFO。如果我close FIFO并重新打开以循环写入,是否清除/清除了它? (保证吗?)

@编辑,

检查inode总是产生相同的inode编号。我的意思是,即使我通过终端使用rm <fifo.name>,然后重新创建FIFO,也给出了相同的inode编号。

FIFO = '/tmp/test.fifo'
fd = os.open(FIFO, os.O_RDONLY)

info = os.fstat(fd)
print("inf fstat " + str(info.st_ino))

statinfo = os.stat(FIFO)
print("inf stat " + str(statinfo.st_ino))

输出:

inf fstat 521406
inf stat 521406

stat信息:

pi@raspberrypi:/tmp $ stat /tmp/test.fifo 
  File: /tmp/test.fifo
  Size: 0           Blocks: 0          IO Block: 4096   fifo
Device: b307h/45831d    Inode: 521406      Links: 1
Access: (0644/prw-r--r--)  Uid: ( 1000/      pi)   Gid: ( 1000/      pi)
Access: 2018-07-27 03:48:05.958234732 -0400
Modify: 2018-07-27 04:25:52.925375655 -0400
Change: 2018-07-27 04:25:52.925375655 -0400
 Birth -

comment中所述,这是Ubuntu 16.04的输出片段,先前已上传到TextUploader

soner@ubuntu:/tmp$ mkfifo test.fifo
soner@ubuntu:/tmp$ stat test.fifo 
  File: 'test.fifo'
  Size: 0           Blocks: 0          IO Block: 4096   fifo
Device: 801h/2049d  Inode: 2228362     Links: 1
Access: (0664/prw-rw-r--)  Uid: ( 1000/   soner)   Gid: ( 1000/   soner)
Access: 2018-07-26 23:41:31.482184467 +0300
Modify: 2018-07-26 23:41:31.482184467 +0300
Change: 2018-07-26 23:41:31.482184467 +0300
 Birth: -
soner@ubuntu:/tmp$ rm test.fifo 
soner@ubuntu:/tmp$ mkfifo test.fifo
soner@ubuntu:/tmp$ stat test.fifo 
  File: 'test.fifo'
  Size: 0           Blocks: 0          IO Block: 4096   fifo
Device: 801h/2049d  Inode: 2228362     Links: 1
Access: (0664/prw-rw-r--)  Uid: ( 1000/   soner)   Gid: ( 1000/   soner)
Access: 2018-07-26 23:41:46.766125062 +0300
Modify: 2018-07-26 23:41:46.766125062 +0300
Change: 2018-07-26 23:41:46.766125062 +0300
 Birth: -
soner@ubuntu:/tmp$ 

1 个答案:

答案 0 :(得分:0)

在从FIFO读取之前,读取器可以调用os.fstat(fd)os.stat(filename),并检查inode编号是否相同。如果不是,则表示写入器已删除并重新创建了FIFO,因此应在读取之前将其重新打开。