Что делает exec() в этой программе? Она перестает выполняться?

#c #operating-system #system-calls

#c #операционная система #системные вызовы

Вопрос:

 int main(void){
char *argv[3] = {"Command-line","-1", NULL};
int i;
int pid = fork();
if(pid == 0){
   for(int i=0;i<2;i  ){
      execvp("ls", argv);
      fork();
      printf("%dn",i);
    }
    printf("Onen");
  }
printf("Twon");
return 0;
}
  

Что делает execvp в этой программе? Дочерний процесс продолжает выполняться после этого вызова execvp или он останавливается на этом, и продолжается только родительский процесс?

Другой вопрос, все ли вызовы exec выполняют одно и то же, но только с разными аргументами?

Комментарии:

1. Если execvp не произойдет сбой, она не вернется.

2. fork после execvp не имеет смысла, потому что execvp не возвращается, если это удается.

3. Она не «перестает выполняться». Дочерний элемент становится экземпляром ls , который выполняется до завершения и завершается.

4. Форк после execvp не имеет смысла, но это экзаменационный вопрос в качестве теста. Итак, как только execvp завершен, процесс, который его выполняет, не выполняет строки под ним? Если это верно, то одинаково ли это для всех вызовов exec?

5. Что касается «все ли вызовы exec выполняют одно и то же», предлагаю вам прочитать документацию для получения подробной информации и задать более конкретный вопрос о том, что вы конкретно не понимаете после прочтения этого

Ответ №1:

следующий предлагаемый код:

  1. чистая компиляция
  2. выполняет желаемую функциональность
  3. правильно обрабатывает ошибки

а теперь предлагаемый код:

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


int main(void)
{
    char *args[] = { "ls", NULL };
    int pid = fork();
    switch(pid)
    {
        case 0:
            execvp("ls", args);
            perror( "execvp failed" );
            exit( EXIT_FAILURE );
            break;
            
        case -1:
            perror( "fork failed" );
            exit( EXIT_FAILURE );
            break;
            
        default:
            waitpid( pid, NULL, 0 );
            break;
    }
    return 0;
}
  

частичный список выходных данных (когда ошибок не возникает) является:

 ...
untitled
untitled1.c
untitled1.o
untitled2
untitled2.c
untitled2.o
untitled.c
untitled.c~
untitled.html
untitled.mak
untitled.o
untitled.s
untitled.txt
...