Ожидание execvp в главном

int main() { ... if(!fork()) { execvp(cmdName,cmdParam); } printf("In main()..."); return(0); } 
  1. Предполагая, что я правильно передал аргументы cmdName & cmdParam, как дождаться завершения процесса, созданного execvp, до возобновления выполнения функции main ()?
  2. Создает ли execvp () процесс, являющийся потомком нового процесса fork () ed?

  1. В родительском процессе fork возвращает PID дочернего процесса, поэтому вы можете сохранить это в переменной, а затем использовать waitpid для ожидания завершения дочернего процесса.

  2. На самом деле – новый дочерний процесс, созданный fork является дубликатом родительского элемента, а execvp затем заменяет его образ процесса новым изображением. Фактически вы изначально имеете две «копии» родителя, одна из которых затем «становится» новой программой.

Как уже отмечалось, вам нужно сохранить значение вызова fork. Вы действительно должны использовать больше, чем если бы на развилке. Существует три случая:

  1. 0: вы являетесь дочерним процессом
  2. 0: вы являетесь родителем и получили ребенка PID назад

  3. -1: произошло что-то ужасное, а вилка не удалась

Вы действительно хотите знать о случае 3, это испортит весь ваш день. (также вызов exec)

 int main() { int pid = fork(); if(-1 == pid) { fprintf(stderr, "Big problems forking %s\n", strerror(errno); exit(-1);//or whatever } else if (0 == pid) { if (-1 == execvp(cmdName,cmdParam)) { //like above, get some output about what happened } } //no need to else here, execvp shouldn't return // if it does you've taken care of it above waitpid(pid, NULL, 0); printf("Resuming main()..."); } 

Возrotation (0); }

Для вашего первого вопроса:

Используйте waitpid (2) следующим образом:

 int pid = fork(); if (!pid) { execvp(cmdName, cmdParam); } waitpid(pid, NULL, 0); printf("Resuming main()...\n"); 

Для второй части: все вызовы функции exec принимают процесс (ни один из них не возвращается)

Вам нужно сохранить возвращаемое значение fork() , которое возвращает другое значение для каждого исполняемого файла (0, если вы являетесь дочерним PID, если вы являетесь родителем), а затем вам нужно сделать waitpid