私はシグナルハンドラを2つの独立したプロセス、すなわち通知のためのライタとリーダのコンテキストで作業したいと考えています。ライタは、ライタからの第2の信号SIGUSR2を聞くまでループする第1の信号SIGUSR1をリーダに送る。 writer.cでCのネストされたシグナルハンドラ
reader.c
static volatile sig_atomic_t done_waiting;
int handler1(int signal){
done_waiting = 0;
while(!done_waiting){
(void)fprintf(stdout, " reader waiting for sigusr2: done_waiting = %d\n", done_waiting);
}
(void)fprintf(stdout, " reader received sigusr2 \n);
}
int handler2 (int signal){
done_waiting = 1;
}
main(){
signal(SIGUSR1, handler1);
signal(SIGUSR2, handler2);
sleep(5); // sleep till we start worker
}
、信号がIは、読者が最初のワーカー続い実行すると、プログラムはwhileループで終了
main(){
kill(pid_reader, SIGUSR1);
sleep(5);
kill (pid_reader, SIGUSR2);
}
としてリーダに送信されます。そして、執筆者は、「あなたに属する一致するプロセスは見つかりませんでした」と印刷します。
ネスティングシグナルハンドラは許可されていますか?はいの場合は推奨されますか?また、ライターが準備ができていることを読者に知らせるための他の代替メカニズムがありますか?
参照[ 'シグナルハンドラでのprintf()'使用して回避する方法?](http://stackoverflow.com/questions/16891019/how-で、Linux上でテスト済み基本的な情報のためにシグナル・ハンドラ/を使用してシグナル・ハンドラを使用しないようにする)。シグナルハンドラでできるだけ少なくする必要があります。シグナルハンドラでどの関数を呼び出すことができるか厳密に制限されています。また 'printf()'関数群はOK関数のリストにはありません(どちらも助けあれば 'strlen 'printf()'その他の理由があり、 'strlen()'の良い理由は分かりません)。 –
シグナルハンドラを「入れ子にしている」わけではなく、ハンドラを異なるシグナル用に2つインストールしました。また、 'sigsuspend(2)'とそれに関連した呼び出しを見てください。これはシグナルを待つことができます( 'while'ループでここで待っています)。 – bnaecker