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


使用

Lwt 使用函数 Sys.getpwdLwt_unix.chdirLwt_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。所以是的,这段代码是正确的。

相关内容

  • 没有找到相关文章

最新更新