QA@IT

pthread_atfork() に与える関数は async-signal-safe である必要がある?

4029 PV

ある所で、pthread_atfork()に与える関数は async-signal-safeでなければならないという記述をみかけたのですがmanにはそのような事は書いてないし、下記の想定使用例とも矛盾してるように思います。

これを避けるためには、 pthread_atfork で次のようなハンドラを登録すればよい: prepare ハンドラで mutex を
(ロックする際の順序で) ロックし、 parent ハンドラで mutex をロック解除する。 child ハンドラでは
pthread_mutex_init を使用して mutex を初期化しなければならない。

実際の所はどうなんでしょうか?

回答

規格の観点から答えると、「はい、async-signal-safeにしてください」が端的な回答なのですが、理由があほらしくて、forkがasync-signal-safeに指定されているからシグナルハンドラからforkが呼ばれるかも知れなくて、その場合、pthread_atforkのコールバックもシグナルハンドラから呼ばれるから。という理由

なので、実践的にはシグナルハンドラからforkを呼ばないというオレルールを適用することで、async-signal-safeじゃない関数を使う事ができます。というよりこうしないとpthread_atfork()は実用になりません。

将来のSUSではforkがasync-signal-safeのリストから外れる予定です。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。