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

时间:2015-06-16 08:48:18

标签: ocaml ocaml-lwt

使用函数Sys.getpwdLwt_unix.chdirLwt_process.exec Lwt 的特定目录开始流程很容易:

  1. 使用Sys.getpwd保存当前工作目录
  2. 使用Lwt_unix.chdir更改为特定目录
  3. 使用Lwt_process.exec启动外部流程
  4. 使用Lwt_unix.chdir更改为已保存的当前工作目录
  5. 这个逻辑是有缺陷的,因为它允许调度程序在第一次调用Lwt_unix.chdir之后和调用Lwt_process.exec之后运行另一个线程,这将导致该线程在中运行特殊目录而不是保存的当前目录。是否可以轻松地从具有 Lwt 的特殊目录启动流程,而不会引入竞争条件,例如我所描述的竞争条件?

1 个答案:

答案 0 :(得分:2)

您可以使用某些同步原语(如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。所以是的,这段代码是正确的。