2015-01-17 97 views
1

这里是我的代码:POSIX多线程和信号配置

void handler(int sig) 
{ 
    printf("%lu recv signal\n", pthread_self()); 
} 

void* thread_fun(void *threadid) 
{ 

    printf("thread %lu created\n", pthread_self()); 
    while(1){ 
     sleep(1); 
} 
return NULL; 
} 

int main(void) 
{ 
    struct sigaction act; 
    act.sa_handler = handler; 
    sigemptyset(&act.sa_mask); 
    act.sa_flags = 0; 
    sigaction(SIGINT, &act, NULL); 

    printf("thread %lu created\n", pthread_self()); 
    pthread_t t1,t2; 
    pthread_create(&t1, NULL, thread_fun, NULL); 
    pthread_create(&t2, NULL, thread_fun, NULL); 

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

APUE表明,在多线程处理,信号像SIGINT将被输送到一个随机的线程,但是,当我运行在Ubuntu这个代码14.04,似乎信号总是传递给主线程。有谁知道有什么问题?

+1

正式的,你不应该在信号处理程序中调用'printf()'。请参阅[如何避免在信号处理程序中调用'printf()'](http://stackoverflow.com/questions/16891019/how-to-avoid-using-printf-in-a-signal-handler/16891799# 16891799) –

回答

3

“随机线程”并不意味着它被传递给随机选择的线程,而是可以传递给实现者想要的任何线程。所以随机选择是可能的,但任何其他选择都是可能的。在你的系统上,选择是:如果可能的话,首先使用主线程。您可以阅读 OpenGroup Signal Concepts document。没有“随机”选择。据说在所有线程中,将选择不阻止信号或等待信号的线程。

所以你唯一应该考虑的是可能任何线程都可以接收信号。

+0

感谢您的回答! –