我创建FIFO在不相关的进程之间进行通信。在我的项目中,没有办法打破程序在其中运行的无限循环。因此,我无法unlink
FIFO。
我认为,如果FIFO在编写器进程中预先存在,则可以删除并重新创建相同的名称。但是,如果读取器进程在写入进程有机会删除并重新创建它之前打开FIFO,该怎么办?在这方面,我可以使用sleep
,但似乎效率不高。
此外,我还认为我可以暂停读取器进程,直到接收到来自写入器进程的信号,但读取器进程的PID未知。将它们视为两个单独且不同的bash脚本。操作系统启动后不久就开始执行。
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$
答案 0 :(得分:0)
在从FIFO读取之前,读取器可以调用os.fstat(fd)
和os.stat(filename)
,并检查inode编号是否相同。如果不是,则表示写入器已删除并重新创建了FIFO,因此应在读取之前将其重新打开。