Запуск / приостановка дочерних процессов в C? - PullRequest
2 голосов
/ 04 февраля 2012

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

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

edit: Что я пытаюсь сделать

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

Ответы [ 2 ]

1 голос
/ 04 февраля 2012

В 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 голосов
/ 04 февраля 2012

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

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

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

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

...