execlp | попробуйте запустить frok с помощью execlp, но все, что он делает после execlp, не запускается - PullRequest
1 голос
/ 09 июля 2020

Я пытаюсь узнать, у кого работают fork и execlp, но столкнулся с неожиданным поведением. Думаю, я что-то упустил. Как видно из моего кода в дочернем процессе, команда printf не выполняет только execlp, а затем родительский процесс, почему это так? моя ожидаемая печать: pid. c 5 10

, но я получил: pid. c 10

#include<stdio.h> 
#include<stdlib.h> 
#include<sys/wait.h> 
#include<unistd.h> 

int value = 10;
int main()
{
 pid_t pid;
 pid = fork();
 if (pid == 0) {
  value -= 5;
  execlp("/bin/cat","cat","pid.c",NULL);
  printf("%d\n",value);
  return 0;
}
else if (pid > 0) {
  wait(NULL);
  printf("%d\n",value);
  return 0;
   }
 }

1 Ответ

0 голосов
/ 09 июля 2020

После успешного вызова exec*() образ процесса заменяется, и код после этого вызова не выполняется. Таким образом,

printf("%d\n",value);

в первой условной ветке никогда не выполняется в случае успеха.

Вам придется fork() снова только для execlp() -call:

value -= 5;
if (fork() == 0) {
    execlp("/bin/cat","cat","pid.c",NULL);
    exit(1);
}
wait(NULL);
printf("%d\n",value);

Кстати. execlp() не предназначен для использования с абсолютным путем к исполняемому файлу, это то, для чего предназначен execl().

...