killのコマンド。 +++ recieve.c +++ #include <signal.h> #include <stdio.h> #include <unistd.h>
killのコマンド。 +++ recieve.c +++ #include <signal.h> #include <stdio.h> #include <unistd.h> void ha(int sig, siginfo_t *info, void *v) { printf("pid; %d\n", info->si_pid); sleep(10); printf("uid; %d\n", info->si_uid); } int main() { struct sigaction act; act.sa_flags = SA_SIGINFO; act.sa_sigaction = ha; sigemptyset(&act.sa_mask); sigaction(SIGINT, &act, NULL); printf("%d\n", getpid()); puts("send signal"); pause(); puts("signal handled"); puts("send signal"); pause(); puts("signal handled"); return 0; } +++++++++++ +++ send.c ++++ #include <stdio.h> #include <unistd.h> #include <stdlib.h> int main(int argc, char **argv) { printf("%d\n", getpid()); kill(atoi(argv[1]), SIGINT); return 0; } ++++++++++++ recieve.cを実行結果(出力内容) ######### 4155 send signal // send signal出力された後、1度だけsend.cを実行 pid; 4205 uid; 5404 signal handled send signal // send signal出力された後、1度だけsend.cを実行 pid; 4220 // sleepしている間にsend.cを10回連続で実行し続けてみた。 uid; 5404 pid; 0 // 何がおきた?? uid; 0 signal handled ######### 1。あるシグナルのハンドラー実行中に同じシグナルが送られてきた場合って、どうなるんでしょうか? ハンドラーが中断して、またハンドラーが呼び出されるというようなことはおこらないということはわかりました。 ハンドラー終了後、実行していなかった呼び出された分のハンドラーが送られたシグナルの回数分実行される訳ではないということはわかるのですが。。 2。なぜ値は0になったのでしょうか?
ベストアンサー
結局 シグナルハンドラの中で sleepを使うと、動作が保証されないのですね。 sleep は、内部で時間になるまでシグナルを待つという関数です。 それをシグナルハンドラ内でやってしまうと ??になってしまいます。
質問者からのお礼コメント
ありがとうございました!勉強になりました!
お礼日時:1/8 22:25