2017-06-22 57 views
0

我想在使用自定義處理程序的多個進程之間發送SIGUSR1/SIGUSR2信號,但是我的處理程序不起作用。它不打印任何調試消息或任何東西。使用sigaction在Linux中的信號處理程序(C++)

我在這裏創建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到第二個過程:

1 3156發送USR1週四6月22日18時04分54秒2017年

我想這個問題是我如何創建多個進程或如何設置我的處理程序。

+1

你應該小心與POSIX信號:當消防信號,它可以中斷一切(甚至內核調用)。這意味着,在處理信號時,您可能處於不正確的狀態,您可能會遇到數據競爭......在信號處理程序中,您應該儘可能快地出去,並且您應該儘可能多地進行操作效果(如I/O)。 – nefas

+0

感謝您的建議,但是如果我的處理程序只有一條調試消息。它仍然不會打印它。 – Dmitry

+0

''send_signal''做些什麼? – nefas

回答

0

send_signal做什麼? 嘗試發送使用kill功能的信號:

殺(pidArray [1],SIGUSR1)

+0

是的,就像那樣,但對於不同的過程 – Dmitry