int main() { ... if(!fork()) { execvp(cmdName,cmdParam); } printf("In main()..."); return(0); }
В родительском процессе fork
возвращает PID дочернего процесса, поэтому вы можете сохранить это в переменной, а затем использовать waitpid
для ожидания завершения дочернего процесса.
На самом деле – новый дочерний процесс, созданный fork
является дубликатом родительского элемента, а execvp
затем заменяет его образ процесса новым изображением. Фактически вы изначально имеете две «копии» родителя, одна из которых затем «становится» новой программой.
Как уже отмечалось, вам нужно сохранить значение вызова fork. Вы действительно должны использовать больше, чем если бы на развилке. Существует три случая:
0: вы являетесь родителем и получили ребенка PID назад
Вы действительно хотите знать о случае 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