たとえば、ディレクトリではなくファイルのソリューションのみを見つけることができますlsof
。chflags
読み取りオプションがないので、どうすればいいかわかりません。
答え1
ディレクトリ操作のロック方式は、inode 別 (->i_mutex) とファイルシステム別 (->s_vfs_rename_mutex) の 2 つのロックに基づいています。
ディレクトリではなく複数のオブジェクトにi_mutexを使用する場合は、常にアドレスが増加する順にロックを取得します。以下では、これを「inode ポインタ」シーケンスといいます。
私たちの目的のために、すべての仕事は5つのカテゴリに分けられます。
1)読み取りアクセス。ロックルール:呼び出し側は、私たちがアクセスしているディレクトリをロックします。
2) オブジェクトの作成。ロックルール:上記と同じです。
3) オブジェクトの除去。ロックルール:呼び出し元は親をロックし、被害者を見つけ、被害者をロックし、メソッドを呼び出します。
4) 名前変更() すなわちいいえディレクトリ全体にわたって。ロックルール:呼び出し側は親エントリをロックし、ソースと宛先を見つけます。ターゲットがすでに存在する場合はロックされます。ソースがディレクトリでない場合はロックされます。これが私たちが両方ともロックする必要があることを意味する場合は、inodeポインタの順序でロックします。
5) リンク生成。ロックルール:*親ロック*ソースがディレクトリではないことを確認してください。 *ソースロック*このメソッドを呼び出します。
6) ディレクトリ間の名前変更。全体の群れの中で最も大変です。ロックルール:*ファイルシステムロック*ソースとターゲットを見つけてください。 *前の親がターゲットと同じかターゲットの子である場合、-ENOTEMPTYで失敗します。 *新しい親がソースと同じかソースの子である場合、-ELOOPで失敗します。 *ターゲットが存在する場合はロックされます。ソースがディレクトリでない場合はロックされます。これがソースとターゲットをロックする必要があることを意味する場合は、inodeポインタの順序でこれを実行してください。 *このメソッドを呼び出してください。
上記の6つのディレクトリ操作の情報を使用して、ディレクトリロックを確認するスクリプトを作成できます。