多线程信号
Linux C 的信号处置, 在单线程和多线程的程序中,有较大区别.
以下通过程序示例演示多线程中的信号捕获.
main.c
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <pthread.h>
int ktask_running = 0;
int ktask_kill = 0;
static sigset_t ksigs;
void* routine_signal(void* arg)
{
int dunno;
int ret = 0;
while(1) {
ret = sigwait(&ksigs, &dunno);
if(0 != ret) {
fprintf(stderr, "sigwait error.\n");
sleep(1);
}
else {
ktask_kill = 1;
}
}
return NULL;
}
void* routine_task(void* arg)
{
ktask_running = 1;
while(!ktask_kill) {
printf("doing task.\n");
sleep(1);
}
ktask_running = 0;
return NULL;
}
int main()
{
/* 各调用的返回值判断请自行添加. */
sigemptyset(&ksigs);
sigaddset(&ksigs, SIGUSR1);
pthread_sigmask(SIG_BLOCK, &ksigs, NULL);
pthread_t pth;
pthread_create(&pth, NULL, routine_signal, NULL);
pthread_create(&pth, NULL, routine_task, NULL);
while(1) {
if(ktask_running) {
printf("thread is running.\n");
}
else {
printf("thread is not running.\n");
}
sleep(1);
}
return 0;
}
编译命令 gcc -Wall -o mutilthread_signal main.c
测试方法: 先运行mutilthread_signal . 然后在控制输入 killall -s SIGUSR mutilthread_signal
对于多线程信号, 如实例中需要一个单独的线程来接收和处置信号. 接收到信号后可通过修改公共变量值或者发消息的形式影响或者通知到其他线程.