メインスレッドのerrno処理に影響を与えないように、errno変数を格納する次のシグナルハンドラーコードに出くわしました。
void myhandler(int signo)
{
int esaved;
esaved = errno;
write(STDOUT_FILENO, "Got a signal\n", 13);
errno = esaved;
}
しかし、これは本当に目的を果たしますか? write() の直後で errno を復元する前に、別のスレッドが共有 errno 変数をチェックするとどうなりますか? そのスレッドは、競合状態のために間違った errno 値を取得しますか?
または、シグナルハンドラーがスレッド/プロセスに関してアトミックに実行されるため、シグナルハンドラーが実行されると、カーネルはシグナルハンドラーが終了するまでスレッドをスケジュールしませんか?
言い換えれば、-いったん開始されると、シグナルハンドラは以下によって中断されることなく実行されます:
- 1) Scheduler (process/threads), or
- 2) Other signals, or
- 3) Hardware interrupt handlers ?