QA@IT

Linuxでabort()がまれにクラッシュする

5933 PV

Linux上のマルチスレッドプログラムでabort()を呼ぶとまれにクラッシュします。終了させるつもりでabort()しているので実害はないのですがSIGSEGVがなんとなく気持ち悪いです

回答

仕様です。

これはそもそも要求仕様が狂ってるのでどうしようもないのです。以下の2つの仕様がコンフリクトしています

1)非常に多くのプログラムが(標準エラー出力ではなく)標準出力にエラーを書いた後abortするので、abortの中でstdioをflushすることが求められている
2)Single Unix Specification はabort()がasync-signal-safe、つまりシグナルハンドラーから呼び出せることを要求している。つまりabortの中でロックはとれない

この相反する要求を解決するために意図定期にioのロックをとらずにstdioのデータ構造を触っているので別スレッドが微妙なタイミングで同じ場所を触っていると危険があぶない。これはヘタにロックをとりにいってデッドロックするよりかはクラッシュした方が実害がするくない(だって、どうせ終わるつもりだったんだろ?)という理屈

SolarisとかだとSpecをガン無視してシグナルハンドラから呼べない仕様にして、ロックをきちんととるのでこの問題はおきませんね。そのかわり、シグナルハンドラからabort()したり別スレッドがロック取りっぱなしにしてるとデッドロックするけど。。。

どうしてもイヤなら、SIGABRTの自前シグナルハンドラをインストールしておいて、なにも後始末せずにいきなり _exit() すれば回避できると思います

編集 履歴 (0)
ウォッチ

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