コードで動作していない。のprintfは(最小の場合)最初の質問にCシグナルハンドラ
#include <stdio.h>
#include <signal.h>
int counter = 0;
void react_to_signal(int n) {
fprintf(stderr, "Caught!\n");
counter++;
}
int main(int argc, char** argv) {
signal(SIGINFO, react_to_signal);
while (1) {
printf("%d\n", counter);
}
return 0;
}
Iコードを実行する、それが別のシェルで次に0をプリントアウト、それが必要としてループ..
kill -s SIGINFO <pid_of_my_process>
信号が配信されると、c
が増加しますが、fprintf
は発生しません。
これはなぜですか?どの環境/コンテキストでハンドラコードが実行されますか?どこでこれを読むことができますか?
'fflush(stderr) 'を使用してstderrをフラッシュしようとしてください。 – Saphrosit
printf()et.alを使用しないでください。内部シグナルハンドラ。彼らはシグナルセーフではありません(例えば、シグナルセーフではないmalloc()を呼び出すことができます)。 – wildplasser
面白いことに、私が投稿した前に、fflushで変種を試していたと私は誓っていました。再コンパイルして実行したり、無限ループでメッセージを画面外に移動したりして、自分自身を足で撃ったことはありません。だから無気力で、ばかな。 – ntl0ve