Поднятие сигналов и использование обработчиков в C - PullRequest
1 голос
/ 11 марта 2012

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

Я почти уверен, что сигнал повышен с помощью обозначения signal(SIGINT, handler);, поэтому я бы просто поместил его в функцию, определенную одним дочерним процессом, но как мне "отправить" сигнал обоим процессам??Как я могу при определенных условиях сказать, что один процесс получает сигнал и делает то, что ему говорит обработчик, а другой получает сигнал и ничего не делает?

Я читал о том, как kill(pid, handler) сможет отправить назначенный процесс обработчику, но всякий раз, когда я пытаюсь это сделать, он говорит мне, что аргумент 1 из kill делает целое число из указателя без приведения.

Моя программа - это программа для чтения / записи, которая в значительной степени тестирует концепции без определенной цели, и в настоящее время все в одном исходном документе, но будет разделена на источник для определения функций процесса чтения,источник писателя, который будет определять функцию процесса писателя, а затем основной источник, который создает два дочерних процесса.У меня также будет заголовочный файл, в котором будут определены все необходимые константы и прототипы функций, но сейчас, если я смогу просто заставить его работать из одного источника, я смогу позже выяснить, как разделить его на несколько источников.

1 Ответ

1 голос
/ 11 марта 2012

Этот ответ основан на моем прочтении главы GNU C Manual по сигналам .

Как говорит Керрек, signal () позволяет процессам регистрироваться в ОС, которая существует.сигнал о том, что процесс хотел бы, чтобы операционная система доставляла ему данные.После того, как сигнал сгенерирован, аргумент sighandler_t для signal () указывает, что будет делать процесс: либо обработка по умолчанию (SIG_DFL), либо игнорирование сигнала (SIG_IGN), либо что-то пользовательское, как определено функцией-обработчиком, которая передается в signal).В этой функции-обработчике вы определяете поведение одного процесса, чтобы что-то делать с ним при доставке сигнала.

Задача второго процесса - поднять указанный сигнал после периода sleep (), чтобы онДля этого нужно использовать функцию kill (pid, signum), которая берет PID предполагаемого получателя и сигнал для доставки указанному получателю.

...