我有以下简单的 OCaml 异步作业,该作业应该写入文件并终止进程。
Unix.openfile "foobar" ~mode:[`Creat;`Rdwr]
>>= fun fd ->
let wr = Writer.create fd in
Writer.write wr "this is a test";
Unix.close fd
>>= fun () ->
exit 0
但是,似乎
fd
在执行写入之前关闭(显示的sexp的一部分是“writer fd意外关闭”)。有没有办法在关闭文件描述符之前等待写入完成?实际上,我不明白为什么 Writer.write
不像 Deferred.t
那样返回 Reader.read
。不就解决问题了吗
我的问题实际上有点普遍。基本上,我有一个定期工作,使用
Clock.every'
将一些内容写入文件。程序可以随时退出并关闭文件描述符。如何确保在 fd
关闭之前处理所有写入?
如果我停止的工作是:
Unix.close fd
>>= fun () ->
exit 0
预定写入很可能发生在
Unix.close fd
和 exit 0
之间。
在您的特定情况下,您不应直接使用
Unix.close
函数关闭文件描述符。这个想法是,您实际上将 fd
的所有权转移给了编写者,因此现在编写者有责任关闭文件描述符。因此,您需要使用 Writer.close
返回延迟的单位。该函数将等待所有挂起的写入完成,然后关闭文件描述符,例如,
Unix.openfile "foobar" ~mode:[`Creat;`Rdwr]
>>= fun fd ->
let wr = Writer.create fd in
Writer.write wr "this is a test";
Writer.close fd
>>= fun () ->
exit 0
回答您更普遍的问题“有没有办法在关闭文件描述符之前等待写入完成?”。是的,
Writer.close
会等待。从某种意义上说,它将返回一个延迟,该延迟将在所有内容都写入并且 fd 关闭后确定。您还可以使用 force_close
参数,如果它被认为是挂起程序的更好选择,它将强制关闭操作导致突然写入。例如,您可以给程序一段合理的时间来刷新数据,然后因错误而终止。