Bash flock:为什么是200?

39

关于这个线程:bash flock: exit if can't acquire lock

如果有人能解释一下'200'代表什么,我会很感激。

我已经阅读了flock的相关内容,似乎200是指定一个文件描述符,但是这个数字有什么好处呢?


2
这只是一个任意的文件描述符号码。 - Mat
1个回答

62

数字200本身并没有什么特别之处,它只是在flock命令的man页面中用作示例;而且它是一个比较大的数字,因此在脚本运行期间打开的任何其他文件的文件描述符中,不太可能与之冲突。

在您的评论中,您提到了:

( 
  flock -e 200
  echo "In critical section"
  sleep 5 
) 200>/tmp/blah.lockfile 
echo "After critical section"

括号()会创建一个子shell,这是一个独立于父进程的新进程。而200>/tmp/blah.lockfile则导致该进程打开文件描述符为200的/tmp/blah.lockfile以供写入。括号中的命令将在该shell内执行。

flock -e 200会对文件描述符为200的文件获取排它锁。排它锁意味着任何试图对该文件进行加锁(无论是共享锁还是排它锁)的操作将被阻塞(等待),直到此锁被释放或超时或要求不阻塞为止。因此,在子shell的其余部分(即echosleep命令中),该锁将由该子shell持有,其他人将不能获取该锁。一旦子shell完成,文件将被关闭并释放锁定。


7
在技术上并不是必需的;您可以在执行代码之前获取锁,然后在之后释放它。不过,这样做可以方便地管理锁定;当子shell退出时,您确保锁将被释放,因此您不会忘记释放锁(或由于其他原因未能释放它),而且只需匹配括号即可轻松查看锁定适用的范围。 - Brian Campbell
1
谢谢您的回答。不过,有没有简单的方法确保没有冲突?“不太可能”并不总是足够的。 - didi_X8
1
@didi_X8 使用真正的编程语言而不是Bash。Bash适用于快速和简单的脚本;如果您想要关于行为的保证,最好不要使用具有许多奇怪和令人惊讶的行为(例如执行环境变量内容)的语言。话虽如此,在Bash中,除非您明确使用该文件描述符进行重定向; exec 3>/some/file或具有类似编号的重定向的子shell,否则您不会打开新的文件描述符。因此,您可以手动跟踪数字,记住0、1和2是stdin、stdout和stderr。 - Brian Campbell
好的回答。谢谢!我也在想这些完全相同的问题。(括号和200) - so.very.tired
4
如果你在多个脚本中使用这种技术,你会使用不同的数字还是不同的锁定文件名? - Kalpesh Soni
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接