2015-03-03 65 views
0

我試圖在我當前的信號處理程序中訂閱新的信號處理程序,但沒有任何反應。 usr1b沒有輸出打印在終端,usr1a的輸出打印在終端。c - 無法在Linux中訂閱新的信號處理程序

代碼:

#include<signal.h> 
#include<stdio.h> 
#include<unistd.h> 

static int counter = 0; 

void usr1b(int sig1) { 
    printf("usr1b\n"); 
    counter++; 
    printf("current count: %d", counter); 
} 

void usr1a(int sig) { 
    printf("usr1a\n"); 
    if(signal(SIGUSR1, usr1b) == SIG_ERR) { 
     printf("ERROR\n"); // subscribe usr1b to SIGUSR1 
    } 
} 

int main(void) { 
    if(signal(SIGINT, SIG_IGN)==SIG_ERR) 
     printf("ERROR"); // ignore SIGINT 

    if(signal(SIGUSR1, usr1a)==SIG_ERR) 
     printf("ERROR"); // subscribe usr1a to SIGUSR1 

    printf("Send some signal to process %d\n", getpid()); 

    while (1) { 
     sleep(1); 
    } 
    return 0; 
} 
+0

您發送另一個'SIGUSR1'的過程?另外,請注意嚴格地說,在信號處理程序中使用'printf'是不允許的(但通常是有效的)。 – Wintermute 2015-03-03 10:55:03

+0

考慮使用['sigaction'而不是'signal'](http://stackoverflow.com/a/232711/132382) – pilcrow 2015-03-04 18:01:02

回答

0

嘗試......

static void usr1b(int signo) { 
    if (signo == SIGUSR1) { 
     cnt++; 
     printf("SIGUSR1 count: %d\n", cnt); 
    } 
}