2017-06-22 10 views
0

カスタムハンドラを使用して複数のプロセス間でSIGUSR1/SIGUSR2シグナルを送信しようとしましたが、ハンドラが機能しません。デバッグメッセージなどは表示されません。sigaction(C++)を使用したLinuxのシグナルハンドラ

ここで私は8つのプロセスを作成し、set_sigaction機能を使用してカスタムハンドラを設定しようとしています:ここで

int main(){ 
    pidArray = (int *)mmap(NULL, MMAP_SIZE, PROT_READ | PROT_WRITE,MAP_ANONYMOUS | MAP_SHARED, -1, 0);//Self pid 
    pidArray2 = (int *)mmap(NULL, MMAP_SIZE, PROT_READ | PROT_WRITE,MAP_ANONYMOUS | MAP_SHARED, -1, 0);//Child pid 
    counter = (int *)mmap(NULL, MMAP_SIZE2, PROT_READ | PROT_WRITE,MAP_ANONYMOUS | MAP_SHARED, -1, 0); 
    counter[0]=0; 
    counter[1]=0; 
    pid_t pid, pid2; 
    int counter = 1; 
    pidArray[0]=getpid(); 
    pid = fork(); //1 
    if(pid == 0){ 
     pid = fork(); //2 
     if(pid != 0){ 
      pidArray[1]=getpid(); 
      pidArray2[1]=pid; 
     } 
     if(pid == 0){ 
      pid2 = getpid(); 
      pidArray[2]=pid2; 
      pid=fork(); //4 
      if(pid == 0){ 
       pidArray[4] = getpid(); 
       pid=fork(); //5 
       if(pid==0){ 
        pidArray[5] = getpid(); 
        pidArray2[5] = 0; 
       } 
       else 
        pidArray2[4] = pid; 
      } 
     if(pid2 == getpid()){ 
      pid2 = fork(); //3 
      if(pid2!=0){ 
       pid = setpgid(pid,pid2); 
      } 
      else{ 
       pidArray[3]=getpid(); 
       pid=fork(); //6 
       if(pid==0){ 
        pidArray[6]=getpid(); 
        pid=fork(); //7 
        if(pid==0){ 
         pidArray[7]=getpid(); 
         pid=fork(); //8 
         if(pid!=0) 
          pidArray2[7]=pid; 
         else{ 
          pidArray[8]=getpid(); 
          pidArray2[8]=pidArray[1]; 
         } 

        } 
        else 
         pidArray2[6]=pid; 
       } 
       else 
        pidArray2[3]=pid; 
      } 
     }   
     } 
    } 

    set_sigaction(SIGUSR1); 

    sleep(5); 

    if(getpid()==pidArray[1]) 
     kill(pidArray[0],SIGTERM); 
    if(getpid()==pidArray[1]){ 
     send_signal(pidArray[1]); 
    } 
    sleep(100); 
    return 0; 

はset_sigaction機能である:

static int set_sigaction(int signo) 
{ 
    struct sigaction sa; 
    memset(&sa, 0, sizeof(struct sigaction)); 
    sa.sa_sigaction = handler; 
    sigemptyset(&sa.sa_mask); 
    sa.sa_flags = SA_SIGINFO; 
    return sigaction(signo, &sa, NULL); 
} 

そして、ここでは、ハンドラです:

static void handler(int signo, siginfo_t* si, void* ucontext){ 
    int k; 
    int i; 
    pid_t pid = getpid(); 
    for(i=1;i<9;i++){ 
     if(pidArray[i]==pid) 
      k=i; 
    } 
    time_t rawtime; 
    time (&rawtime); 
    cout << k << " " << pid << " Got USR1 " << ctime (&rawtime) << "\n"; 
    send_signal(getpid()); 
} 

send_signal関数が私にこのメッセージを送ります。つまり、SIGUSR1 siを送信します。第二の方法にgnal:18時04分54秒に2017

をUSR1木6月22日を送る、私はこの問題を考えてい

1 3156は、私は複数のプロセスを作成するか、またはどのように私は私のハンドラを設定する方法です。

+1

:とき信号火災、それはすべてのもの(でもカーネルコールを)中断することができ としてキル機能を使用して信号を送信してみてください。これは、信号を処理するときに、潜在的に不正な状態にあることを意味します。データ競合が発生する可能性があります。シグナルハンドラではできるだけ早く脱出しようとするべきであり、エフェクト(I/Oなど)。 – nefas

+0

あなたの助言をありがとう、私のハンドラがデバッグメッセージだけを持っている場合。それでも印刷されません。 – Dmitry

+0

'' send_signal''は何をしますか? – nefas

答えて

0

send_signalとは何ですか?あなたはPOSIX信号に注意する必要があります

キル(pidArray [1]、SIGUSR1)

+0

そうですね、それは異なるプロセスのためです – Dmitry

関連する問題