#POSIXでは言及がないので保証されてないみたい。Solarisのマニュアルではasync signal safeと明記してあった。ちょっと気になるのは、シグナルハンドラが呼ばれた時点でシステム的にそのシグナルは自動的にマスクされて、ハンドラが戻った直後にアンマスクされるから、ハンドラ内でマスクしても上書きされちゃうのかな、という点。
#ああ、glibcのマニュアルには記述があった。ハンドラ内でsigprocmask使ってもいいけど、ハンドラから戻ったらマスクも元にもどるよ、とのこと。
#とすると、上の「シグナルを自分に投げる」方法は、最悪の場合同じスレッドで延々とループする危険があるのか…
#pthread_* は全てasync signal safeの保証がないのか。厳しいな。シグナル処理専用スレッドを作っといてpthread_killでそっちに処理を回そうとか思ったんだがそれも無理とな。
#twitter->chatonフィードがうまく動いてないので手動転載: @omasanori says: POSIXを持っていないのでSUSを確認したところ、pthread_sigmaskはSUSv3(POSIX.1-2001ベース)では非同期シグナル安全を要求されていませんが、SUSv4(同2008ベース)では要求されているようです。(現状追認?)
#だとすると有難い。>pthread_kill OpenGroupのサイトでも古いのしか出てこないみたいなんだよね。
##FYI :-)
#ありがとうございます。
#シグナル専用スレッドに処理を回すとしても、元々の障害のように「このスレッドでしかアンマスクしてないからここにシグナルが来るはず」で待ってるスレッドが起きなくなるという問題は残るのか。
#Gaucheの管理下のスレッドのマスク一覧をどっかに取っといて、シグナル処理専用スレッドがそれを見て受け取れるやつに再配送する、というところまでやれば何とかなりそうだが、ちと大掛かりだな。
#言語レベルではシグナルなんかに触らせない、という設計が一番いいんだろうなあ(スレッド/プロセス間通信はチャネルとかで抽象化する)。だけどGaucheではシステム密着な処理も書きたいからなあ。