2012-02-03 6 views
2

Я запускаю дочерние процессы в C, и я хочу приостановить, а затем запустить один и тот же дочерний процесс. Не совсем уверен, как лучше описать мою проблему, так как я новичок в этом, но вот выстрел.Запуск/приостановка дочерних процессов в C?

Так что я знаю, что вы можете запустить процесс после выхода другого процесса с помощью waitpid. Но что, если процесс, которого я жду, не существует при создании процесса, который выполняет ожидание. Поэтому в этом случае я думаю о приостановке процесса, который выполняет ожидание, и когда процесс, который ждет, создается, а затем завершается, он будет вызывать процесс, который ожидает ожидание. Итак, как бы вы это сделали? Опять же, я не знаком с этим, поэтому я не знаю, подходит ли это для этого.

редактировать: То, что я пытаюсь сделать

Я использую дочерние процессы для запуска команды через execvp() параллельно, так что если у меня есть последовательность sleep 1; sleep 1;, общее время сна будет 1 секунда. Однако есть случаи, когда я пытаюсь выполнить параллельный echo blah > file; cat < file;, и в этом случае я предполагаю, что cat читает файл после echo входов blah в файл. Поэтому я должен ждать echo, чтобы закончить, чтобы сделать cat. Для этого есть более определенные особенности, но обычно предполагают, что для любой команды с выходом в файл должна быть ожидаема любая команда, которая читает файл позже в скрипте.

+0

Какая у вас внешняя проблема? Зачем вам нужен процесс ожидания? –

+1

Вы получаете PID, когда вы вызываете fork(); Если вы не видели руководство Beej, я бы предложил следующее: http://beej.us/guide/bgipc/output/html/multipage/fork.html Если вам нужно знать, когда ребенок закончен, вам понадобится своего рода МПК. – EdH

+0

это зависит от ОС, его не является частью стандарта C, поэтому вам нужно быть немного более конкретным в отношении того, что вы пишете. Я предполагаю * nix. –

ответ

1

В Linux: Вы можете установить alarm() прежде чем waitpid(), так что вы можете пробуждения после определенного количества секунд и waitpid() должен вернуть EINTR, чтобы вы знали бы ситуацию и можете убить сбойные один. Другим способом было бы использовать семафор и имеющий блок, как это в процессе ожидания:

if (pthread_mutex_trylock(&mutex) { 
    sleep(some seconds); 
    if (pthread_mutex_trylock(&mutex) { 
    kill the process 
    } 
} 

и процесс, который отслеживается:

НАЧАЛЬНЫЙ МОМЕНТ:

pthread_mutex_lock(&mutex); 
do_stuff(); 
pthread_mutex_unlock(&mutex); 
0

Любое приложение (процесс) может только ждать с waitpid() на собственных прямых детей. Он не может ждать внуков или более отдаленных потомков, и он не может ждать ни от братьев и сестер, ни от предков, ни от несвязанных процессов.

Если ваше приложение однопоточное, вы не можете дождаться процесса, который будет создан после вызова waitpid(), потому что для создания дочернего элемента ничего не нужно делать fork().

В многопоточном процессе у вас может быть один поток, ожидающий умирающих детей, а другой поток может создавать детей. Например, вы могли бы затем вызвать вызов waitpid() в начале потока 1 в момент времени T0, а затем создать поток 2 для создания ребенка в T1 (T1> T0), а затем ребенок будет умирать при T2, а waitpid() будет собирать труп ребенок на T3, даже если ребенок был создан после запуска waitpid().

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