0

私は次のようにsigprocmaskを使用しています:

void mask(){
    sigset_t new_set,old_set;
    sigemptyset(&new_set);
    sigaddset(&new_set,SIGALRM);
    sigprocmask(SIG_BLOCK, &new_set, &old_set);
}

驚いたことに、大きなリストを出力する関数は、最初にmask()を呼び出したとしても、シグナルによって何らかの形で中断されます。私の関数は他の関数を呼び出さないため、マスクが失敗したように見えます。したがって、実行中にunmask()が発生することはありません。sigprocmaskが失敗する原因は何ですか?

4

1 に答える 1

1

POSIX仕様から、-1sigprocmask()を返し、失敗した場合はそれに応じてerrnoを設定します。あなたが投稿したコードがあなたが使用しているコードである場合、あなたは明らかにそれが成功したかどうかをチェックしていません。

sigprocmask()成功し、それが呼び出している関数を実際SIGALRMに中断している場合、その関数内の何かがその信号を異なる方法で処理している可能性がmask()非常に高くなります。

他にできることはraise(SIGALRM)、呼び出した直後mask()です。無視された場合は、その下にある他の関数が動作を変更します。

コメントで指摘されているように(おそらく答えであるはずです)、straceそれが実際に当てはまるかどうかを確認するために使用できますltrace。また、該当する場合は、ライブラリの呼び出しをステップスルーするのを監視することもできます。

これは、ハンドラーのインストールに関して失礼なライブラリーを操作する場合はまったく珍しいことではありません(たとえば、シグナルが無視されているかどうか、または動作を変更する前に他の場所で処理されているかどうかを確認します)。

于 2010-05-26T18:31:37.500 に答える