如何使用 Lwt 从特定目录正确启动进程
How to correctly start a process from a specific directory with Lwt
使用 Sys.getpwd
、Lwt_unix.chdir
和 Lwt_process.exec
函数可以很容易地从具有 Lwt 的特定目录启动进程:
- 使用
Sys.getpwd
保存当前工作目录
- 使用
Lwt_unix.chdir
切换到特定目录
- 使用
Lwt_process.exec
启动外部进程
- 使用
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
而没有任何穿插的线程。所以是的,这段代码是正确的。
使用 Sys.getpwd
、Lwt_unix.chdir
和 Lwt_process.exec
函数可以很容易地从具有 Lwt 的特定目录启动进程:
- 使用
Sys.getpwd
保存当前工作目录 - 使用
Lwt_unix.chdir
切换到特定目录 - 使用
Lwt_process.exec
启动外部进程 - 使用
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
而没有任何穿插的线程。所以是的,这段代码是正确的。