我有一个python脚本,在调用时将一些数据写入管道:
def send_to_pipe(s):
send = '/var/tmp/mypipe.pipe'
sp = open(send, 'w')
sp.write(json.dumps(s))
sp.close()
if __name__ == "__main__":
name = sys.argv[1]
command = sys.argv[2]
s = {"name":name, "command":command}
send_to_pipe(s)
然后我有这个文件,无限期地保持管道打开,并在每次调用上面的脚本时读取数据:
def watch_pipe():
receive = '/var/tmp/mypipe.pipe'
os.mkfifo(receive)
rp = os.open(receive, os.O_RDWR | os.O_NONBLOCK)
p = select.poll()
p.register(rp, select.POLLIN)
while True:
try:
if p.poll()[0][1] == select.POLLIN:
data = os.read(rp,512)
# Do some stuff with the data
except:
os.close(rp)
os.unlink(receive)
if __name__ == "__main__":
t = Thread(target=watch_pipe)
t.start()
# Do some other stuff that goes on indefinitely
当我使用线程时,此代码非常有效 . 管道保持打开状态,第一个文件写入管道,然后完成任务 . 问题是我想关闭程序时无法停止线程 . 所以我从Thread切换到Process:
p = Process(target=watch_pipe)
p.start()
但是使用进程而不是线程,当我运行编写器脚本时, open(send, 'w')
删除管道就好像它是我想要覆盖的文件一样 . 为什么是这样?在这两种情况下,文件的权限和所有权都相同,并且编写器脚本不会更改 . 唯一改变的是用类似的Process对象替换Thread对象 .
EDIT: 更改打开后使用'a'而不是'w',管道在使用进程时仍然消失 .
2 回答
只是一个想法,为您的文件使用另一种打开模式,例如
"a"
而不是"w"
. 确实"w"
截断文件,"a"
只会附加到文件 .我可以想象,当你使用线程时,即在一个相同的进程中,当你打开它来写入时,管道文件已经打开以供阅读 . 在这种情况下,打开写入可能不会截断文件 . 与进程相反,写入过程不知道文件是否被打开以进行读取,并且可能会删除它以截断它 .
你为什么要对自己造成困难?您在一个线程中使用的例程中打开了FIFO作为O_RDWR . 如果你想关闭线程,只要让任何其他线程关闭它,向FIFO写一个“停止”消息 . 线程读取消息,关闭自己,所有的一切都是正确的世界 . 没有大惊小怪,没有麻烦,不需要单独的过程 .