execv дочерний процесс существования и прекращения - PullRequest
1 голос
/ 12 декабря 2011

popen () альтернатива - Я использую ответ accepted (метод pipe / fork / exec), чтобы решить мою проблему. Разница лишь в том, что вместо execl я использую execv.

Теперь мой вопрос: имеет ли родительский процесс какой-либо контроль над дочерним процессом, созданным execv? Допустим, вся эта последовательность, предложенная в ответе accepted, предназначена для отслеживания 1 файла, и у меня много таких файлов; Я помещаю всю эту последовательность в функцию, и если я вызываю эту функцию много раз, в какой-то момент времени, возможно ли иметь много дочерних tail процессов вокруг?

То, что я хочу знать, 1) Могу ли я иметь несколько дочерних процессов, запущенных в любой момент времени? 2) как завершаются дочерние процессы (созданные execv)? после вызова execv родитель знает, когда дочерний процесс (созданный execv) завершен / завершен? - ответил.

Ответы [ 3 ]

3 голосов
/ 12 декабря 2011

Execl и execv ведут себя одинаково. Единственное отличие состоит в том, как вы задаете вектор аргумента . Функции "l" принимают вектор аргумента как список, разделенный запятыми. Например.,

execl("/bin/ls", "/bin/ls", "-r", "-t", "-l", NULL);

Функции "v" принимают вектор аргумента как фактический вектор. Например.,

char *args[] = {"/bin/ls", "-r", "-t", "-l", NULL };
execv("/bin/ls", args);

См. здесь или здесь для получения информации об управлении процессом в C.

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

2 голосов
/ 12 декабря 2011

Родитель получает сигнал SIGCHLD.

1 голос
/ 12 декабря 2011

Если у вас есть канал от выхода ребенка, вы часто можете избежать ухудшения сигнала / ожидания, просто наблюдая за тем, как канал получает EOF.Вы все еще должны пожинать ребенка, чтобы избежать зомби, хотя http://en.wikipedia.org/wiki/Zombie_process (если вы не заботитесь о статусе выхода ребенка, это обычно делается с помощью двойной вилки, поэтому вы выполняете свой настоящий подпроцесс как внук и пожинаетесредний ребенок).Код GLib является наиболее сложным возможным примером: http://git.gnome.org/browse/glib/tree/glib/gspawn.c#n1191

...