3

有望に見える定型flock(1)コードを見つけました。盲目的に使用する前に、コンポーネントを理解したいと思います。

これらの関数は 3 番目の形式を使用しているようですflock

群れ [-sxun] [-w タイムアウト] fd

3 番目の形式はシェル スクリプト内で便利で、通常は次のように使用されます。

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

私が迷っている部分(サンプルラッパー関数から)は、この表記法です

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

flockまたはマンページからの略記

200>/var/lock/mylockfile

それは何を達成しますか?

flock最初のリダイレクトの値以外の値を渡す後続のコマンドflockが不平を言うことに気付きました

flock: 50: Bad file descriptor

flockどのファイルを操作するかを知るために、ファイル記述子をマップとして使用しているようです。ただし、それが機能するためには、それらの記述子がまだ存在し、ファイルに関連付けられている必要がありますよね?

リダイレクトが完了し、ロック ファイルが作成された後、ファイルは閉じられ、開いているファイルに関連付けられたファイル記述子は気化されませんか? ファイル記述子は開いているファイルにのみ関連付けられていると思いました。

何が起きてる?

4

1 に答える 1

4
200>/var/lock/mylockfile

これにより、/var/lock/mylockfileサブシェル内のファイル記述子 200 を介して書き込むことができるファイルが作成されます。200という数字は任意のものです。高い数値を選択すると、サブシェル内のコマンドが余分なファイル記述子に「気付く」可能性が低くなります。

(通常、ファイル記述子 0、1、および 2 は、それぞれ stdin、stdout、および stderr で使用されます。この数は 3 まで低くなる可能性があります。)

flock -s 200

次にflock、以前に作成されたファイル記述子を介してファイルをロックするために使用されます。>が提供するファイルへの書き込みアクセスが必要200>です。これは、上記のリダイレクトに発生することに注意してください。

于 2014-02-10T23:24:44.093 に答える