0
最初に呼び出されたときにSIGQUITシグナルを無視し、2番目のSIGQUITシグナルで終了するプロセスにシグナルハンドラをインストールする関数を作成しようとしています。私はカウンタにSIGQUITシグナルが送られた回数を数えるためにグローバル変数を使うつもりです。一度SIGQUITを無視する
しかし、これを実装する際に問題が発生しています。私は最初のSIGQUITシグナルを無視するSIG_IGNを見つけましたが、最初にシグナルを検出してカウンタをインクリメントします(シグナルハンドラを呼び出すためにシグナル()を変更することができます)?
私のコードは以下の通りです:
// global var counter
int signal_counter = 0;
int main (int argc, const char * argv[]) {
pid_t child_pid = 0;
int child_status = 0;
/* fork a child process... */
child_pid = fork();
if(child_pid < 0) { /* fork() and check if there were errors */
perror("fork"); /* print a system-defined error message */
exit(EXIT_FAILURE);
}
else if(child_pid == 0) { /* Child code */
install_handler();
for(; ;sleep(1)); /*loop forever*/
}
else { /* Parent code */
printf("Parent processing starts\n");
printf("\nPARENT: sending first SIGQUIT\n\n");
kill(child_pid,SIGQUIT);
printf("\nPARENT: doing something\n\n");
sleep(3);
printf("\nPARENT: sending SIGQUIT again\n\n");
kill(child_pid,SIGQUIT);
}
return EXIT_SUCCESS;
}
void sigquit() {
printf("SIGQUIT\n");
sleep(2);
exit(0);
}
void install_handler(){
if (signal_counter == 0){
signal(SIGQUIT, sigquit);
signal_counter+=1;
}
else{
signal(SIGQUIT, sigquit);
}
}
任意の助けをいただければ幸いです。
SIG_IGNは使用しないでください。着火した信号はカウントできません。 –
しかし、最初のSIGQUITをどうやって無視するのですか? – Seb
あなたは明らかにそれを無視することはできません。それを処理し、ハンドラのカウンタをインクリメントします。 –