ocaml - 如何使用 Lwt 从特定目录正确启动进程

标签 ocaml ocaml-lwt

使用 Sys.getpwdLwt_unix.chdirLwt 函数可以轻松从特定目录启动进程>Lwt_process.exec:

  1. 使用Sys.getpwd保存当前工作目录
  2. 使用Lwt_unix.chdir更改到特定目录
  3. 使用Lwt_process.exec启动外部进程
  4. 使用Lwt_unix.chdir更改到保存的当前工作目录

这个逻辑是有缺陷的,因为它允许调度程序在第一次调用 Lwt_unix.chdir 和调用 Lwt_process.exec 之后运行另一个线程,这将导致导致该线程在特殊目录中运行,而不是在保存的当前目录中运行。是否可以使用 Lwt 轻松地从特殊目录启动进程,而无需引入我所描述的竞争条件?

最佳答案

您可以使用一些同步原语(例如Lwt_mutex)来保护当前工作目录。但这里有一些警告,假设你有这个链:

lock dir_guard >> chdir dir >> exec proc >> chdir dir' >> unlock dir_guard

这不允许在进程 proc 执行其任务的整个过程中更改目录。这可能过于谨慎和不必要。下面的代码没有这个问题:

let exec_in_folder guard dir proc = 
  with_lock guard (fun () -> 
     chdir dir >>= fun () -> return (exec proc)) >>= fun proc_t ->
  proc_t

但是,这段代码有一个问题,只有当进程以原子方式启动时,它才是正确的,即,如果不存在在进程启动过程中进行一些重新调度的可能性,这将允许其他线程干扰和更改当前文件夹。为了证明它是原子的,您可以阅读源代码,或者实现您自己的启动进程,这将有这样的保证。如果您阅读代码,那么您会发现,该进程是使用 spawn 函数创建的,该瞬间将执行 fork 而不需要任何散布的线程。所以是的,这段代码是正确的。

关于ocaml - 如何使用 Lwt 从特定目录正确启动进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30862802/

相关文章:

ocaml - 你如何在 OCaml/ReasonML 中获取列表的一部分?

design-patterns - OCaml中变体标签的模式匹配

ocaml - 使用 OCaml 编码数据通信客户端 - 服务器

garbage-collection - 关于OCaml GC的minor/young heap

subprocess - LWT 与子流程的简单交互

algorithm - Ocaml函数调用,递归调用自身

ocaml - 排除 OCaml 中 lwt_ppx 的编译错误 : Unable to Compile File

ocaml - Cstruct 和 Lwt_bytes

mysql - Lwt和数据库访问