C言語の捕捉信号

2909 ワード

私たちは時々プログラムの中でユーザーやカーネルから送られた信号に対する処理をしなければなりません.例えば、ファイルを書くなどの後始末をしたり、信号を直接無視したりする必要があります(Ctrl+Cを押すと、私はあなたを相手にしません).以下は信号処理のコード(POSIX C)である.
int catch_signal(int sig,void (*handler)(int)){

    struct sigaction action;//<signal.h>

    action.sa_handler=handler;

    sigemptyset(&action.sa_mask);//      sigaction      

    action.sa_flags=0;

    return sigaction(sig,&action,NULL);//        action   ,           action,      (  )  action,   NULL

}

void myfun(int sig){//

    puts("Goodby the cruel world!
"); exit(1); }

次は、メイン関数で使用できます.
if(catch_signal(SIGINT,myfun)==-1){

    fprintf(stderr,"Can't map the handler");

    exit(2);

}

注意:SIGKILL(kill-KILLでPIDを接続して生成可能)、SIGSTOP(プロセスを一時停止)の2つの信号をキャプチャおよび無視できないことに注意してください.
他の捕捉可能な信号はSIGFPE SIGTERM SIGQUIT SIGTRAP SIGWINCH SIGSEGV SIGPIPEである.
最も恐ろしいのはSIGSEGVだろう.不正なメモリアドレスにアクセスすると、セグメントエラー、コアがダンプされていることがよくある.(連帯SIGQUITかも).
プログラムではraise(int sig)を使用して、信号処理関数で低レベルの信号を受信したときに、より高いレベルの信号(信号アップグレードと呼ばれる)を開始することができる.
 
メモ:
昨日小さなプログラムを書いたことを思い出して、実行時に&バックグラウンドで実行させますが、それをオフにするのは難しいです(どのコマンドで速くていいか分かりません)、普通はある端末で起動したプログラムはその端末のサブプロセス(起動時に追加しない&)、端末をオフにすると端末のサブプロセスも死んでしまいます.しかし、私のプログラムはバックグラウンドで実行させ、起動した端末をオフにして、プログラムは終了していません.プロセスを守るような感じがします.この時、私のプログラムの直接の親プロセスはinitプロセスかもしれません(推測ですが、時間があってから分かります).
ps-aux|grep myProgramでプロセスのpidを見つけ、killで彼女を殺した(私が最初に使ったpkillは、結局死ななかったのか、kill牛皮だったのか).自分が実行しているプログラムを表示できるjobのコマンドがあるような気がしますが、家に着いていないので、もう言わないでください.