4

SUSv4は、async-signal-safe 関数のリストに opendir、readdir、closedir などをリストしていません。

シグナルハンドラからディレクトリリストを安全に読み取る方法はありますか?

たとえば、ディレクトリを「開いて」どうにかして生のディレクトリ リストを丸呑みにすることは可能ですか? もしそうなら、「read」によってどのようなデータ構造が返されますか?

それとも、Linux では、SUSv4 / POSIX で使用できる必要がないにもかかわらず、async-signal-safe である特定のシステム コールがあるのでしょうか。

4

1 に答える 1

2

読み取る必要のあるディレクトリが事前にわかっている場合は、シグナル ハンドラの外側で opendir() を呼び出すことができます (opendir() は malloc() を呼び出すため、ハンドラ内から実行することはできません)。どこかに静的変数。シグナル ハンドラーが実行されるとき、いつでも 1 つのシグナル ハンドラーだけが DIR* ハンドルを使用することを保証できる限り、そのハンドルで readdir_r() を呼び出すことから逃れることができるはずです。readdir() および readdir_r() によって取得される DIR にはロック フィールドがあるため、たとえば、2 つのシグナル ハンドラから DIR* を使用した場合、または複数のシグナルを処理するために同じハンドラを登録した場合、次のようになる可能性があります。中断されたハンドラーによってロックが解放されないため、デッドロックが発生します。

同様のアプローチは、fork() を呼び出した後、execve() を呼び出す前に、子プロセスからディレクトリを読み取るためにも機能するようです。

于 2014-06-27T10:55:23.870 に答える