Linux 在多线程程序中处理特定线程上的信号
Linux handling a signal on a specific thread in a multi-threaded program
我有一个程序,我想接受并处理传入的 TCP 连接,直到它收到终止信号。还有其他线程在进行数据处理,我无法完全控制它们,但如果我想让程序退出,我可以完全控制 stop/abort。
while (true)
{
select(...)?
if (got-terminate-signal)
{
break;
}
else
{
...do stuff with sockets based on select...
}
}
你的问题不是很清楚,但我会想你的意思。
信号就像中断,捕获它们的例程就像中断服务例程(这个类比可能不完美)。您可能会注意到信号发生在处理程序中这一事实,然后通过某种同步方法(例如信号量)向另一个线程发出信号。
快速 Google 搜索会找到很多关于该主题的页面。 Here's one.
... 问题是:如何在主程序中捕获 SIGTERM,但让线程 "deaf" 接收到该信号? 我猜.
pthread_sigmask 函数可用于 allow/deny 向 be/from 传递给线程的特定信号。并非所有信号都可以通过这种方式被阻止,但 SIGTERM 可以。要构建所需的 sigset_t 对象,您可以使用 sigemptyset 和 sigaddset 函数。您可以查看联机帮助页或单击此处:http://cursuri.cs.pub.ro/~apc/2003/resources/pthreads/uguide/users-96.htm
请注意,此函数适用于 "current thread",因此它应该作为线程回调函数执行的第一件事(而不是 "before running the thread")被调用。
我有一个程序,我想接受并处理传入的 TCP 连接,直到它收到终止信号。还有其他线程在进行数据处理,我无法完全控制它们,但如果我想让程序退出,我可以完全控制 stop/abort。
while (true)
{
select(...)?
if (got-terminate-signal)
{
break;
}
else
{
...do stuff with sockets based on select...
}
}
你的问题不是很清楚,但我会想你的意思。
信号就像中断,捕获它们的例程就像中断服务例程(这个类比可能不完美)。您可能会注意到信号发生在处理程序中这一事实,然后通过某种同步方法(例如信号量)向另一个线程发出信号。
快速 Google 搜索会找到很多关于该主题的页面。 Here's one.
... 问题是:如何在主程序中捕获 SIGTERM,但让线程 "deaf" 接收到该信号? 我猜.
pthread_sigmask 函数可用于 allow/deny 向 be/from 传递给线程的特定信号。并非所有信号都可以通过这种方式被阻止,但 SIGTERM 可以。要构建所需的 sigset_t 对象,您可以使用 sigemptyset 和 sigaddset 函数。您可以查看联机帮助页或单击此处:http://cursuri.cs.pub.ro/~apc/2003/resources/pthreads/uguide/users-96.htm
请注意,此函数适用于 "current thread",因此它应该作为线程回调函数执行的第一件事(而不是 "before running the thread")被调用。