我们有一个使用pthread库创建多个线程的应用程序 . 由于我们只希望主进程处理某些信号,因此所有pthread都阻塞了SIGTERM,SIGINT和SIGHUP . 在我们的一个pthreads中,我们使用重新启动网络
system("/etc/init.d/networking restart");
看起来系统调用会分叉另一个继承pthread信号掩码的子进程 . 问题是它重新启动了ssh守护进程,新创建的ssh守护进程从pthread继承了信号掩码(SIGTERM,SIGINT和SIGHUP被阻塞) . 结果是未来网络重启需要很长时间,因为它无法发送SIGTERM并在发送SIGKILL之前等待超时 . 我的问题是从像我们这样的多线程应用程序重启网络的最佳方法是什么 . 有没有办法告诉init重启服务?我想在调用系统之前解锁信号,但是如果有人在此期间终止我们的应用程序,我们的主信号处理程序可能不会被调用 .
我们正在运行嵌入式ARM板上的debian linux发行版 . 这是 uname -a
的输出
Linux ts 2.6.35.3-433-g0fae922 #6 PREEMPT Thu Jul 28 09:24:24 MST 2011 armv7l GNU/Linux
任何帮助,赞赏,
马丁 .
1 回答
这非常不安全,会导致您的应用程序挂起或崩溃 . 见this question和讨论 .
在创建任何线程之前分叉一个孩子 . 让那个孩子在套接字上等待信号(例如
SIGUSR1
) . 醒来后,孩子会做system(...)
然后再回去睡觉 .