使用带文件描述符的方法可以让你更好地控制和管理 flock 以及与锁相关的行为。当你在子进程或子shell中使用文件描述符时,文件锁可以跨越这些范围,并且只有在你显式地释放它时,锁才会被释放。
让我们看一个例子,更好地理解这一点。
假设我们有一个脚本 script_a.sh:
#!/bin/sh
lock_file="/tmp/script_b.lock"
touch "$lock_file"
# 使用带文件描述符的方法
(
flock -n 9 || { echo "Script B is locked, could not acquire lock."; exit 1; }
# 在子进程中执行脚本b
( ./script_b.sh ) &
) 9>"$lock_file"
在这段代码中,主 shell 脚本使用文件描述符 9 来创建并获取锁。当主脚本退出时,由于 script_b.sh 在子进程运行(使用 & 符号),script_b.sh 可以继承父进程(即主 shell 脚本)的文件描述符。
关键在于,script_b.sh 继承了文件描述符 9,而该描述符具有在退出时继续保持文件锁的特性。这意味着,即使主脚本已经退出,script_b.sh 仍然可以继续持有文件锁,直至其运行结束。
这里的一个重要概念是:锁是与文件描述符绑定的,而文件描述符可以在进程之间传递(例如从父进程传递给子进程)。因此,在这个例子中,锁的生命周期取决于文件描述符 9 何时被关闭。而由于 script_b.sh 继承了该文件描述符并一直保持打开状态,因此它可以在主进程退出后继续持有文件锁。
flock 命令会将锁状态与文件描述符状态联系起来。因此,在文件描述符关闭时,操作系统也会

文章讲述了如何利用文件描述符在子进程中管理和控制flock锁,强调了锁与文件描述符的绑定关系以及在进程间共享的重要性。通过实例展示了子进程解锁如何影响父进程的锁状态。
最低0.47元/天 解锁文章
1216

被折叠的 条评论
为什么被折叠?



