分类: LINUX
2013-10-08 20:37:41
对于多线程编程时候,对于signal传递的信号处理函数对于各个线程是共享的,虽然各个线程可以设置自己的屏蔽字。如下面所示代码。两个线程中,每个线程有一个signal接受信号,但是实际上执行时每个线程会执行两个signal信号处理函数。
也可以用 pthread_sigmask(SIG_SETMASK, &set, NULL);设置自己线程的屏蔽字,不接收某个信号。注意::如果没有设置屏蔽字,并且也没有设置signal函数接收SIGUSR1与
SIGUSR12时,用kill发送信号会导致进程直接退出。
#include
#include
#include
#include
#include
void thread_handler_first();
void thread_handler_second();
void sign_handler(int sign);
int main()
{
pthread_t thread_first, thread_second;
if(pthread_create(&thread_first, NULL, (void *)*thread_handler_first, NULL) != 0)
{
printf("create child thread fail\n"); exit(EXIT_FAILURE);
}
else
printf("create first child thread success\n");
if(pthread_create(&thread_second, NULL, (void *)*thread_handler_second, NULL) != 0)
{
printf("create child thread fail\n"); exit(EXIT_FAILURE);
}
else
printf("create second child thread success\n");
sleep(2);
printf("Now the main thread prepare to send SIGUSR1 and SIGUSR2 to first child thread\n");
if(pthread_kill(thread_first, SIGUSR1) || pthread_kill(thread_first, SIGUSR2))
{
printf("send SIGUSR1 and SIGUSR2 to first child thread fail\n"); exit(EXIT_FAILURE);
}
else
printf("send SIGUSR1 and SIGUSR2 to first child thread success\n");
sleep(1);
printf("Now the main thread prepare to send SIGUSR1 and SIGUSR2 to second child thread\n");
if(pthread_kill(thread_second, SIGUSR1) || pthread_kill(thread_second, SIGUSR2))
{
printf("send SIGUSR1 and SIGUSR2 to second child thread fail\n"); exit(EXIT_FAILURE);
}
else
printf("send SIGUSR1 and SIGUSR2 to second child thread success\n");
sleep(1);
printf("Now the main thread prepare to send SIGKILL to both first and second child thread\n");
if(pthread_kill(thread_first, SIGKILL) != 0)
{
printf("send SIGKILL to first child thread fail\n"); exit(EXIT_FAILURE);
}
else
printf("send SIGKILL to first child thread success\n");
if(pthread_kill(thread_first, SIGKILL) != 0)
{
printf("send SIGKILL to second child thread fail\n"); exit(EXIT_FAILURE);
}
else
printf("send SIGKILL to second child thread success\n");
sleep(1);
pthread_join(thread_first, NULL);
pthread_join(thread_second, NULL);
exit(EXIT_SUCCESS);
}
void thread_handler_first()
{
int i;
__sigset_t set;
signal(SIGUSR1, sign_handler);
sigfillset(&set);
sigdelset(&set, SIGUSR1);
sigdelset(&set, SIGUSR2);
pthread_sigmask(SIG_SETMASK, &set, NULL);
for(i = 0; i < 5; i++)
{
printf("this is first thread:%u...\n", pthread_self()); pause();
}
}
void thread_handler_second()
{
int i;
signal(SIGUSR2, sign_handler);
// signal(SIGUSR1, sign_handler);
for(i = 0; i < 5; i++)
{
printf("This is second thread:%u...\n",pthread_self()); pause();
}
}
void sign_handler(int sign)
{
printf("\nthread:%u, receive signal:%u---\n", pthread_self(), sign);
}
执行结果如下:
create first child thread success
create second child thread success
This is second thread:3069864816...
this is first thread:3078257520...
Now the main thread prepare to send SIGUSR1 and SIGUSR2 to first child thread
send SIGUSR1 and SIGUSR2 to first child thread success
thread:3078257520, receive signal:12---
thread:3078257520, receive signal:10---
this is first thread:3078257520...
Now the main thread prepare to send SIGUSR1 and SIGUSR2 to second child thread
send SIGUSR1 and SIGUSR2 to second child thread success
thread:3069864816, receive signal:12---
thread:3069864816, receive signal:10---
This is second thread:3069864816...
Now the main thread prepare to send SIGKILL to both first and second child thread
Killed