使用sigaction在Linux中的信号处理程序(C++)

问题描述:

我想在使用自定义处理程序的多个进程之间发送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

send_signal做什么? 尝试发送使用kill功能的信号:

杀(pidArray [1],SIGUSR1)

+0

是的,就像那样,但对于不同的过程 – Dmitry