Perl: установка обработчиков сигналов в разветвленных дочерних - PullRequest
0 голосов
/ 01 апреля 2011

Я нашел ответ в Управление обработкой сигналов для демонов, которые fork () очень полезны для того, что я делаю. Я не уверен, как решить

«Поэтому вам нужно будет установить любую обработку сигналов в процессе execed при запуске»

У меня нет контроля над процессом, который запускается. Есть ли какой-нибудь способ для меня заставить некоторые маркеры сигнала на exec ed от родителя вилки?

Edit: {
Я пишу модуль Perl, который отслеживает длительные процессы. Вместо

system(<long-running cmd>);

вы бы использовали

my_system(<ID>, <long-running cmd>);

Я создаю файл блокировки для <ID> и не пропускаю еще один my_system(<ID>...) вызов, если в данный момент выполняется один с соответствующим ID.

Родительский ветвь / execs <long-running cmd> и находится в процессе очистки файла блокировки, когда он завершается. Я хотел бы, чтобы ребенок самодостаточный, чтобы родитель мог выйти (или чтобы ребенок мог позаботиться о себе, если родитель получит kill -9).
}

Ответы [ 2 ]

2 голосов
/ 02 апреля 2011

В системах Unix вы можете заставить exec'd процесс игнорировать сигналы (если только процесс не решит переопределить то, что вы говорите), но вы не можете заставить его установить для него обработчик. Максимум, что вы можете сделать, это оставить соответствующий сигнал обработчиком по умолчанию.

Если вы подумаете об этом, вы поймете, почему. Чтобы установить обработчик сигнала, вы должны предоставить указатель на функцию - но процесс, который выполняет exec(), не может указать одну из своих функций, потому что они не будут существовать как часть процесса exec'd, и он может ' t указать одну из функций процессов exec'd, потому что они не существуют как часть процесса exec'ing. Точно так же вы не можете зарегистрировать обработчики atexit() в процессе exec'ing, которые будут выполняться процессом exec'd.

Что касается вашей проблемы программирования, то есть веская причина, по которой файл блокировки обычно содержит идентификатор процесса (pid) процесса, который удерживает блокировку; это позволяет вам проверить, продолжается ли этот процесс, даже если это не ваш ребенок. Вы можете прочитать pid из файла блокировки, а затем использовать kill(pid, 0), который сообщит вам, существует ли процесс, и вы можете сообщить об этом, фактически не посылая никакого сигнала.

1 голос
/ 02 апреля 2011

Один из подходов заключается в использовании двух вилок.

Первый форк создаст дочерний процесс, отвечающий за очистку файла блокировки, если родитель умирает.Этот процесс также разветвляет внука, который будет выполнять долгосрочную команду.

...