2

使用Lwt函数很容易从特定目录启动进程Sys.getpwdLwt_unix.chdir并且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从特殊目录轻松启动进程,而无需引入我所描述的竞争条件?

4

1 回答 1

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没有任何穿插线程的情况下执行。所以是的,这段代码是正确的。

于 2015-06-16T13:35:41.540 回答