Linux Перезапуск сети из программы на C - PullRequest
0 голосов
/ 16 ноября 2011

У нас есть приложение, которое создает несколько потоков, используя библиотеку pthread.Поскольку мы хотим, чтобы только основной процесс обрабатывал определенные сигналы, все потоки имеют блоки SIGTERM, SIGINT и SIGHUP.В одном из наших pthread-ов мы перезапускаем сеть, используя

system("/etc/init.d/networking restart");

Похоже, что системный вызов разветвит другой дочерний процесс, который наследует маску сигналов pthreadПроблема в том, что он перезапускает демон ssh, а недавно созданный демон ssh унаследовал маску сигналов из нашего pthread (блокируются SIGTERM, SIGINT и SIGHUP).В результате будущая сеть перезагружается, что занимает много времени, так как она не может отправить SIGTERM и ожидает тайм-аут перед отправкой SIGKILL.Мой вопрос заключается в том, как лучше всего перезагрузить сеть из многопоточного приложения, такого как наше.Есть ли способ сказать init перезапустить службу?Я думал о разблокировании сигналов перед вызовом системы, но если кто-то завершит наше приложение в течение этого времени, наш основной обработчик сигналов может не быть вызван.Вот вывод из uname -a

Linux ts 2.6.35.3-433-g0fae922 #6 PREEMPT Thu Jul 28 09:24:24 MST 2011 armv7l GNU/Linux

Любая помощь приветствуется,

Мартин.

1 Ответ

1 голос
/ 16 ноября 2011

В одном из наших потоков мы перезапускаем сеть, используя system(...).

Это крайне небезопасно и может привести к зависанию или аварийному завершению работы вашего приложения. См. этот вопрос и обсуждение.

Каков наилучший способ перезагрузить сеть из многопоточного приложения

Разветвите ребенка до Вы создали какие-либо темы. Пусть этот ребенок подождет в розетке или подаст сигнал (например, SIGUSR1). Проснувшись, ребенок сделает system(...) и снова уснет.

...