завершение родительского и дочернего процесса по Ctrl-C - PullRequest
2 голосов
/ 13 января 2012

Я пишу программу на C, в которой родительский ветвь n дочерних процессов.Однажды созданный дочерний процесс вызывает SIGSTOP, чтобы разрешить создание других дочерних процессов.Родитель после создания всех дочерних процессов n отправляет сигнал SIGCONT всем дочерним процессам.

Все дочерние процессы выполняют бесконечный цикл и совместно используют общий ресурс с помощью семафоров.Теперь я хочу, чтобы всякий раз, когда пользователь нажимал ctrl-c , родительский и все дочерние процессы завершались вместе.Однако перед завершением дочерние процессы должны обновить в файле, сколько раз каждый из них использовал ресурс.

Например:

Process 1 - 5 times
Process 2 - 3 times

и так далее

Нужна помощь в этой реализации, пожалуйста ...

Ответы [ 2 ]

2 голосов
/ 14 января 2012

Формальная функция обработчика сигнала должна делать как можно меньше.Стандарт C говорит, что он может записывать в переменную volatile sig_atomic_t или вызывать abort() или _Exit() (или, с ограничениями, signal()).POSIX позволяет многому случиться, и вы, вероятно, работаете над Linux (хотя вы этого не сказали).Итак, ваш обработчик сигнала изменит значение переменной sig_atomic_t с 0 на 1, чтобы указать, что сигнал произошел.

Итак, ваши дочерние процессы будут зацикливаться.Как часть условия цикла, вы должны проверить переменную sig_atomic_t, чтобы увидеть, должен ли дочерний элемент завершаться.Когда он обнаруживает, что произошел сигнал, он прекращает цикл, открывает файл журнала для добавления, записывает свою информацию в этот файл и завершает работу.Вы можете проверить переменную sig_atomic_t в других точках обработки, кроме только условия основного цикла;это ваше решение.

Обратите внимание, что вы должны использовать sigaction() вместо signal() для управления обработкой сигнала, и вам следует блокировать прерывания при обработке сигнала.

Итак, подведем итог:

  • Ваш обработчик сигнала делает как можно меньше.
  • Ваш код обнаруживает в главном цикле, когда обработчик сигнала был вызван, и организует выход.
  • ВашКод также может определять, когда обработчик сигнала вызывался в других удобных точках.
  • Вы можете вызвать функцию для ведения журнала и выхода.
0 голосов
/ 14 января 2012

Чтобы записать файл, вам нужно добавить код для записи в указанный файл в вашем обработчике сигналов для SIGINT. Если вы хотите, чтобы каждый процесс записывал в этот файл, вам необходимо убедиться, что SIGINT отправляется всей группе процессов.

Вероятно, вы можете обойтись без отправки SIGQUIT каждому, так как вы могли бы заставить каждый процесс просто завершить себя после обработки SIGINT. Если вы хотите немного оптимизировать, вы можете сохранить общую структуру данных, процессы которой уже получили SIGINT, чтобы вы не отправляли каждому процессу несколько SIGINT.

...