Linux 中的多线程信号处理
- 2024-10-14 08:40:00
- admin 原创
- 71
问题描述:
在 Linux 中,当一个程序(可能有多个线程)收到信号(如 SIGTERM 或 SIGHUP)时会发生什么?
哪个线程截取了信号?多个线程可以获取相同的信号吗?是否有专门用于处理信号的特殊线程?如果没有,处理信号的线程内部会发生什么?信号处理程序例程完成后如何恢复执行?
解决方案 1:
pthreads(7)
描述POSIX.1要求进程中的所有线程共享属性,包括:
信号配置
POSIX.1 还要求每个线程具有不同的某些属性,其中包括:
信号掩码 (
pthread_sigmask(3)
)交替信号栈 (
sigaltstack(2)
)
Linux内核的complete_signal
例程中有如下代码块--其中的注释非常有用:
/*
* Now find a thread we can wake up to take the signal off the queue.
*
* If the main thread wants the signal, it gets first crack.
* Probably the least surprising to the average bear.
*/
if (wants_signal(sig, p))
t = p;
else if (!group || thread_group_empty(p))
/*
* There is just one thread and it does not need to be woken.
* It will dequeue unblocked signals before it runs again.
*/
return;
else {
/*
* Otherwise try to find a suitable thread.
*/
t = signal->curr_target;
while (!wants_signal(sig, t)) {
t = next_thread(t);
if (t == signal->curr_target)
/*
* No thread needs to be woken.
* Any eligible threads will see
* the signal in the queue soon.
*/
return;
}
signal->curr_target = t;
}
/*
* Found a killable thread. If the signal will be fatal,
* then start taking the whole group down immediately.
*/
if (sig_fatal(p, sig) &&
!(signal->flags & SIGNAL_GROUP_EXIT) &&
!sigismember(&t->real_blocked, sig) &&
(sig == SIGKILL || !p->ptrace)) {
/*
* This signal will be fatal to the whole group.
*/
因此,您会发现您负责控制信号的传送位置:
如果您的进程已将信号的处置设置为SIG_IGN
或SIG_DFL
,则所有线程都会忽略该信号(或默认 - 杀死、核心或忽略)。
如果您的进程已将信号的处置设置为特定的处理程序例程,那么您可以通过使用 操作特定的线程信号掩码来控制哪个线程将接收信号pthread_sigmask(3)
。您可以指定一个线程来管理所有信号,或者为每个信号创建一个线程,或者为特定信号混合使用这些选项,或者您可以依赖 Linux 内核当前的默认行为将信号传递给主线程。
但是,根据手册signal(7)
页,有些信号是特殊的:
信号可能为整个进程生成(并因此处于待处理状态)(例如,使用kill(2)发送时),也可能为特定线程生成(例如,执行特定机器语言指令后生成的某些信号(如 SIGSEGV 和 SIGFPE)是线程定向的,使用
pthread_kill(3)针对特定线程的信号也是如此)。进程定向信号可以传递给当前未阻塞信号的任何一个线程。如果多个线程的信号未阻塞,则内核会选择任意一个线程来传递信号。
解决方案 2:
这有点微妙,取决于您使用的 Linux 内核版本。
假设 2.6 posix 线程,如果您说的是 OS 发送 SIGTERM 或 SIGHUP,则信号将发送到进程,由根线程接收并处理。使用 POSIX 线程,您也可以将 SIGTERM 发送到单个线程,但我怀疑您问的是当 OS 将信号发送到进程时会发生什么。
在 2.6 中,SIGTERM 将导致子线程“干净”退出,而在 2.4 中,子线程处于不确定状态。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件