2014-10-04 2 views
0

Я создаю относительно простую многопроцессную программу, чтобы узнать о сигналах и обработке сигналов в Linux с помощью C. У меня есть несколько процессов обработки сигналов (я использую sigaction для назначения обработчиков), которые отправляются всем процессам в группу процессов и один процесс отслеживания, который отображает некоторую информацию после обнаружения определенного количества сигналов.Выходной сигнал обработки сигнала Выпуск

Мой вопрос в том, что. Как я уверенно отображать вывод консоли из процесса отслеживания? Этот процесс должен отображать текущее количество обнаруженных сигналов, и я знаю, что printf() нехорошо вызывать из обработчика сигнала. Я знаю, что могу использовать write(), но я не уверен, что могу поместить переменные значения в это для отображения, и я думаю, что этот системный вызов может быть прерван сигналами.

Не могли бы вы привести простой пример с тремя процессами (один из которых генерирует сигнал (родительский), 1 обрабатывает сигнал (дочерний 1) и один отчет о сигналах (ребенок 2)) или объясняет, как этот процесс репортера должен обрабатывать выходные данные со значениями глобальных общих переменных?

Благодаря

ответ

1

См How to avoid using printf() in a signal handler? некоторую информацию о том, что может быть сделано в обработчике сигнала.

Я не могу дать вам «простой» пример для вашего 3 запроса процесса, потому что сценарий, который вы набросаете, невероятно сложный - как на земле третий процесс будет знать о том, какие сигналы передают первый процесс второму процессу ? Сигналы очень грубые; имеется очень мало информации, отличной от «посылаемого сигнала» (немного больше, если вы используете sa_sigaction член struct sigaction и SA_SIGINFO при вызове функции sigaction()). Для большинства практических целей то, что вы просите, не может быть сделано.

Если вы собираетесь приблизиться к своему сценарию, возможно, метод состоит в том, чтобы настроить сегмент разделяемой памяти в родительском объекте, к которому имеют доступ оба ребенка. Второй ребенок (приемник сигналов) может затем копировать информацию в разделяемую память, когда он получает сигнал, а третий ребенок копирует информацию из общей памяти и записывает ее. Вам нужно посмотреть, какие функции координации (если они есть) доступны для функции обработчика сигнала - в вопросе x-ref'd есть ответы, которые охватывают этот момент (и ответ выглядит как «none», или только грубые например open() или mkdir()). Любопытно, что стандарт POSIX не перечисляет функцию, такую ​​как strcpy() или memcpy() как безопасный для сигнала.

Что касается «надежного отображения вывода на консоль», что будет делать ваш процесс в ожидании сигналов? Вы можете организовать обработчик сигнала, чтобы установить флаг, и код цикла может организовать проверку флага, форматирование и запись данных (даже при стандартном вводе-выводе, это уже не в обработчике сигналов), прежде чем идти назад, чтобы ждать следующего сигнала.

+0

Благодарим за информацию о printf(). Я знаю, что вы говорите об одном процессе, знаете, что делает другой. У меня есть глобально разделяемые переменные, используя mmap(), который вводит проблемы параллелизма, которые я могу обрабатывать со спин-блокировками, sem, mutext и т. Д. Мне просто нужно отправить сигналы всем процессам и получить их запись, получая их репортерный процесс получает одинаковые сигналы и отображает глобально разделенные данные после подсчета количества сигналов. – OwlsCIS

Смежные вопросы