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 对象,您可以使用 sigemptysetsigaddset 函数。您可以查看联机帮助页或单击此处:http://cursuri.cs.pub.ro/~apc/2003/resources/pthreads/uguide/users-96.htm

请注意,此函数适用于 "current thread",因此它应该作为线程回调函数执行的第一件事(而不是 "before running the thread")被调用。