как работает системный вызов execlp ()?

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>

int main(){
pid_t pid;
pid = fork();
if(pid<0){
   fprintf(stderr, "fork failed");
   return 1;    }
else if(pid == 0){  
   execlp("bin/ls", "ls", NULL);}
else{
   wait(NULL);
   printf("child completen");
   }
return 0;
}

здесь, насколько я мог понять, создается дочерний процесс, и поскольку его pid, возвращаемый fork, равен "0", он входит в блок, содержащий execlp, и выполняет его, а затем родитель ждет, пока ребенок выйдет, а затем печатает"child complete". Пожалуйста, поправьте меня, если я ошибаюсь. Но я не понял, как здесь работает execlp (). Кто-нибудь может это объяснить?

2 ответов


fork создает новый процесс, он вызывается один раз родителем, но возвращается дважды в родителе и в потомке.

в дочернем процессе разговора execlp выполняет указанную команду ls.

это заменяет дочерний процесс новым файлом программы (ls program file), что означает следующее.

когда процесс вызывает execlp или один из других 7 exec функции, этот процесс полностью заменен новым программа, и новая программа начинает выполнять в своей основной функция.

идентификатор процесса не изменяется через exec, потому что новый процесс не создан. exec просто заменяет текст, данные, кучу и стек текущего процесса сегменты с совершенно новой программой с диска.

сочетание fork следовал по exec называется spawning a new process на некоторых операционных системах.

надеюсь, это было более или менее понятно. Дайте мне знать, если у вас больше вопросы.


семейство функций exec() заменяет текущий образ процесса на новый образ процесса.