Linux从C程序的pthread重新启动网络



我们有一个使用pthread库创建多个线程的应用程序。因为我们只想让主进程处理某些信号,所以所有的pthread都有SIGTERM, SIGINT和SIGHUP阻塞。在其中一个pthread中,我们使用

重新启动网络
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

感谢任何帮助,

马丁

在一个pthread中,我们使用system(...)重新启动网络。

这是非常不安全的,并且会导致应用程序挂起或崩溃。请看这个问题和讨论。

从多线程应用程序中重新启动网络的最佳方法是什么

在创建任何线程之前派生一个子。让该子线程等待套接字或信号(例如SIGUSR1)。当孩子被叫醒时,他会做system(...)然后继续睡觉。

最新更新