【问题标题】:What does 200>"$somefile" accomplish? [duplicate]200>"$somefile" 完成了什么? [复制]
【发布时间】:2014-03-08 12:47:32
【问题描述】:

我发现boilerplate flock(1) code 看起来很有希望。现在我想在盲目使用之前了解组件。

似乎这些函数使用flock的第三种形式

flock [-sxun] [-w timeout] fd

第三种形式在 shell 脚本中很方便,通常使用 方式如下:

(
 flock -s 200 
 # ... commands executed under lock ... 
) 200>/var/lock/mylockfile

我迷失的部分(来自sample wrapper functions)是这个符号

eval "exec $LOCKFD>\"$LOCKFILE\""

或简写自 flock 手册页

200>/var/lock/mylockfile

这样做有什么作用?

我注意到flock 的后续命令传递的值与初始重定向中的值不同,导致flock 抱怨

flock: 50: Bad file descriptor

似乎flock 正在使用文件描述符作为映射来了解要对哪个文件进行操作。但是,为了使其正常工作,这些描述符必须仍然存在并与文件相关联,对吧?

重定向完成并创建锁定文件后,文件是否已关闭,与打开文件关联的文件描述符是否已蒸发?我认为文件描述符只与打开的文件相关联。

这是怎么回事?

【问题讨论】:

  • 我在大学学习 Unix 和 Linux 编程已经至少 10 年了,所以文件描述符现在对我来说有点模糊。请多多包涵!
  • 它将文件描述符 #200 重定向到该路径名。

标签: bash exec file-descriptor flock


【解决方案1】:
200>/var/lock/mylockfile

这将创建一个文件/var/lock/mylockfile,可以通过子shell 内的文件描述符200 写入该文件。数字 200 是任意数字。选择一个大的数字会减少子外壳内的任何命令“注意到”额外文件描述符的机会。

(通常,文件描述符 0、1 和 2 分别由 stdin、stdout 和 stderr 使用。这个数字可能低至 3。)

flock -s 200

然后flock用于通过之前创建的文件描述符锁定文件。它需要对文件的写访问权限,这是200> 中的> 提供的。请注意,这发生在 上述重定向之后。

【讨论】:

  • 所以从另一个进程调用200>/var/lock/mylockfile 确实没有害处,因为如果该进程不是最初获得锁的进程,对flock -xn 200 的调用仍然会爆炸?
  • 只要记住每个进程都有自己的文件描述符。子进程继承它们,但不相关的进程不共享描述符。 200 可以在不同的进程中引用不同的文件。不知道这能不能回答你的问题?
  • 我有点困惑,如果 200 被其他地方的 shell 使用会发生什么。也不明白为什么它不使用 3-9,除非您在其他地方明确定义,否则 bash 肯定不会使用它们?或者在任意分配一个之前为什么不检查 /proc/self/fd?
  • 我唯一仍然缺少的是,即使flock -xn 200 被称为之后 200>/var/lock/mylockfile,到那时/var/lock/mylockfile 还没有关闭,因此文件描述符 200 不再与该进程中的文件关联?那么flock 怎么会知道 50 例如不用于创建文件。似乎出现了flock: 50: Bad file descriptor 之类的错误。
  • 200> 适用于括号内的所有内容。 /var/lock/mylockfile 在整个子外壳完成之前不会关闭。 flock 运行时,文件描述符 200 仍将打开,并且由于子进程继承其父进程的文件描述符,它也可以写入 fd 200。
猜你喜欢
  • 2020-09-09
  • 2020-01-13
  • 2013-08-27
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 2015-10-18
  • 2011-02-03
  • 1970-01-01
相关资源
最近更新 更多