Chinaunix
标题:
如何实现信号让子线程接收,而非主线程???
[打印本页]
作者:
wangzhixing_tt
时间:
2019-03-25 18:43
标题:
如何实现信号让子线程接收,而非主线程???
#include <sys/syscall.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
volatile bool g_terminate = false;
static void* signal_thread(void*)
{
//设置该子线程可以接收的信号:SIGINT SIGQUIT SIGTERM
sigset_t mark;
sigemptyset(&mark);
sigaddset(&mark, SIGINT);
sigaddset(&mark, SIGQUIT);
sigaddset(&mark, SIGTERM);
int signal;
int rlt = sigwait(&mark, &signal);
if (0 != rlt)
{
printf("sigwait error: %d", rlt);
return (void*)0;
}
printf("[tid=%d] recv terminate signal: %d\n", (int)syscall(SYS_gettid), signal);
if (!g_terminate)
{
g_terminate = true;
}
return (void*)0;
}
int main(int argc, char** argv)
{
printf("[tid=%d] main thread\n", (int)syscall(SYS_gettid));
//所有线程都忽略这些信号:SIGHUP SIGPIPE
signal(SIGHUP, SIG_IGN);
signal(SIGPIPE, SIG_IGN);
//主线程屏蔽这些信号:SIGINT SIGQUIT SIGTERM
sigset_t mark;
sigemptyset(&mark);
sigaddset(&mark, SIGINT);
sigaddset(&mark, SIGQUIT);
sigaddset(&mark, SIGTERM);
pthread_sigmask(SIG_SETMASK, &mark, NULL);
//创建子线程,让它来接收这些信号:SIGINT SIGQUIT SIGTERM
pthread_t thread;
pthread_create(&thread, NULL, &signal_thread, NULL);
sleep(10);
if (g_terminate)
{
//处理一些不可重入的函数
复制代码
执行命令:
ps aux | grep 'test' | grep -v 'grep' | awk '{print $2}' | xargs kill -s 2
目的是不想让主线程收到信号2,而是子线程收到
因为收到信号后,我必须要处理一些不可重入的函数!
但实际情况,我这样写还是主线程收到,子线程收不到,不知道写错了,望指教!!!
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2