【发布时间】:2012-01-09 15:01:43
【问题描述】:
我在应用程序中有一个线程,它有这样的循环:
...
while (1)
{
checkDatabase();
checkChildren();
sleep(3);
}
...
checkDatabase() 是不言自明的; checkChildren() 只是调用 waitpid(-1, &status, WNOHANG) 来处理已经退出或收到信号的子进程。
该应用程序运行良好,但它具有默认的信号处理。问题是这个父进程有许多线程(现在不要担心子进程)而且我对同步信号没有任何经验,更不用说在 POSIX 线程应用程序中了。我以前用过signal(),但显然它是不可移植的,而且它也不能满足我的需要。我完全没有使用sigaction 方法的经验,也找不到关于如何填写结构等的好的文档。
我需要做的是在上述循环中同步捕获SIGINT、SIGTERM 和SIGQUIT 等终止信号(并且我需要完全忽略SIGPIPE 以便我可以捕获EPIPE 错误来自 IO 方法),所以它看起来像这样:
...
while (1)
{
checkDatabase();
checkChildren();
checkForSignals();
sleep(3);
}
...
所有其他线程不应该与信号有任何关系;只有执行这个循环的线程应该知道它。而且,很明显,它需要是一个非阻塞检查,这样循环在它的第一次迭代中就不会阻塞。如果找到信号,则调用的方法将整理其他线程并销毁互斥锁,等等。
谁能给我一个提示?非常感谢。
【问题讨论】:
-
synchronous signals,您的意思是您希望避免注册信号处理程序? -
是的,我认为它会组织得更好,也更安全,因为我知道某些调用在异步信号处理程序中是不安全的。我猜这是最好的方法,但我不是 100% 确定。其中一个问题还与 ANSI 信号处理不可移植有关,尽管这不是主要问题。