2017-11-04 21 views
1

ここでは、スリープ中に親にSIGINT信号を送りたいと思います。私はプログラムの後に書くことでそれを試みました。このプログラムでは、親からのSIGINTのシグナルハンドラがまったく実行されていないのはなぜですか?ここ はコードです:子から親への信号の送信

#include<stdio.h> 
#include<signal.h> 
#include<unistd.h> 
#include<stdlib.h> 
void sig_usr(int signo){ 
    if(signo == SIGINT) 
    printf("Signal caught!"); 
    return; 
} 

int main(void){ 
    pid_t pid, ppid; 
    ppid = getpid(); 
    printf("ppid = %d\n", ppid); 
    if((pid = fork()) == 0){ 
     printf("killing parent...\n"); 
     kill(ppid, SIGINT); 
     printf("After killing parent...\n"); 
    } 
    else{ 
     sleep(5); 
     printf("%d %d ",ppid, pid); 
     if(signal(SIGINT,sig_usr) == SIG_ERR) 
      printf("Signal processed "); 
    } 
    return 0; 
} 

出力: 出力がこれだけ多くのコンテンツを印刷しています。私は親が全く実行されていないと思う。

The output is printing only this much content. I think parent is not executing at all.

答えて

2

あなたはSIGINTがそうでない場合、ハンドラが実行されません、親プロセスに送信される前にシグナルハンドラを設定する必要があります。また、親プロセスは何かを実行する前に殺されています。この問題を解決する簡単な方法は、親プロセスのコードの後に​​スリープコールを移動し、子プロセスに遅延を追加することです。

#include<stdio.h> 
#include<signal.h> 
#include<unistd.h> 
#include<stdlib.h> 
void sig_usr(int signo){ 
    if(signo == SIGINT) 
    printf("Signal caught!"); 
    return; 
} 

int main(void){ 
    pid_t pid, ppid; 
    ppid = getpid(); 
    printf("ppid = %d\n", ppid); 
    if((pid = fork()) == 0){ 
     sleep(1); // Wait for parent to finish setting up 
     printf("killing parent...\n"); 
     kill(ppid, SIGINT); 
     printf("After killing parent...\n"); 
    } 
    else{ 
     printf("%d %d ",ppid, pid); 
     if(signal(SIGINT,sig_usr) == SIG_ERR) 
      printf("Signal processed "); 
     sleep(5); // Wait to be killed 
    } 
    return 0; 
} 
+0

はID0 @、ありがとう – Vijesh

2

SIGINTを送信したときsignalはまだ呼び出されていません。

私はあなたがSIGINTを送信する前にシグナルハンドラを設定したいと思う:

#include<stdio.h> 
#include<signal.h> 
#include<unistd.h> 
#include<stdlib.h> 
void sig_usr(int signo){ 
    if(signo == SIGINT) 
    printf("Signal caught!"); 
    return; 
} 

int main(void){ 
    pid_t pid, ppid; 
    ppid = getpid(); 
    printf("ppid = %d\n", ppid); 
    if((pid = fork()) == 0){ 
     sleep(1); 
     printf("killing parent...\n"); 
     kill(ppid, SIGINT); 
     printf("After killing parent...\n"); 
    } 
    else{ 
     printf("%d %d ",ppid, pid); 
     if(signal(SIGINT,sig_usr) == SIG_ERR) 
      printf("Signal processed "); 
     sleep(5); 
    } 
    return 0; 
} 
関連する問題