【发布时间】:2017-10-28 21:51:03
【问题描述】:
有没有办法让 fork 产生的不同进程在运行时写入同一个文件?
谢谢
【问题讨论】:
-
你是什么意思,它不是“正常工作”吗?
-
不,我无法让它工作。我初始化了一个新文件,在新文件块中,我有 fork 块,当我尝试将新行附加到文件时它不会写入任何内容。
标签: ruby file process subprocess fork
有没有办法让 fork 产生的不同进程在运行时写入同一个文件?
谢谢
【问题讨论】:
标签: ruby file process subprocess fork
forked 进程将获得原始文件描述符的副本,因此假设父进程在forked 之前持有一个文件句柄,它会“正常工作”(就像多个进程共享一个文件,尽管在fork 情况下请注意,底层内核描述符是相同的,因此您的进程将共享当前偏移量等内容)。如果test.rb 包含
require 'tmpdir'
filename = Dir::Tmpname.make_tmpname('/tmp/', '')
puts filename
file = File.open(filename, 'w')
file.write("Pre-fork\n")
file.flush
pid = fork
file.write(pid ? "In parent\n" : "In child\n")
file.close
然后cat $(ruby ./test.rb) 将包含
Pre-fork
In parent
In child
请注意,我在 fork 之前会刷新文件,以确保由于 IO 缓冲而看不到两个 Pre-forks。根据您想要的“共享”类型,这可能就足够了。
【讨论】: