2013-08-30 2 views
1

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

wait(2) на Linux говорит:

В противном случае они блокируют до тех пор, как ребенок не изменяет состояние или обработчик сигнала прерывания вызова (при условии, что системные вызовы не автоматически перезапущена с использованием SA_RESTART флаг sigaction (2)) ,

Может кто-то показать мне пример того, как я должен настроить сигнал прерывания ждет по истечении заданного времени, а затем продолжить выполнение ?

+0

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

+0

Насколько точны вы после? Целые секунды OK или секунды? –

+0

Время ожидания обычно должно составлять 0,1 - 1 секунду. –

ответ

2

Вы можете использовать alarm(3), чтобы настроить таймер, который отправит SIGALRM вашему процессу, когда он истечет. kill(2) - одна из функций, которую можно безопасно вызывать из обработчика сигнала (см. signal(7) man page), поэтому вы можете просто убить дочерний процесс с помощью обработчика SIGALRM, и блокировка wait(2) или wait(3), которую вы делаете на основном потоке, вернется.

Если вам нужно более высокое разрешение, вы можете вместо этого использовать ualarm(3).