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

Ответы [ 4 ]

3 голосов
/ 03 сентября 2010

Как уже отмечалось, вам нужно сохранить значение вызова 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()...");
}

возврат (0); }

3 голосов
/ 03 сентября 2010

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

Используйте waitpid (2) так:

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

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

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

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

1 голос
/ 03 сентября 2010

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

...