Понимание того, как дочерний процесс выполняется в этом коде - PullRequest
0 голосов
/ 22 апреля 2011

Мне дали этот стартовый код для проекта, но мне трудно понять, как выполняется дочерний процесс.

int pid ;
int child_info = -1;

if ( argv[0] == NULL )      /* nothing succeeds */
  return 0;

if( (pid= fork()==-1)
  perror("fork");

else if ( pid == 0 ){

  signal(SIGINT, SIG_DFL);
  signal(SIGQUIT, SIG_DFL);
  execvp(argv[0], argv);
  perror("cannot execute command");
  exit(1);
}
else {  //check if wait error or print out exit status
  if ( wait(&child_info) == -1 )
    perror("wait");
   else {
     printf("Exit status: %d, %d\n", child_info>>8, child_info&0377);
 }
  }
  return child_info;
}

Глядя на код, текущий процесс разветвляется, и в этом случае дочерний процесс наследует все соответствующие свойства родительского процесса, поскольку в нем нет таймеров, сигналов или чего-либо еще. Однако значения pid новых процессов находятся в диапазоне 18000, так как можно выполнить execvp(argv[0], argv), поскольку в этом случае pid! = 0.

Ответы [ 4 ]

3 голосов
/ 22 апреля 2011

Из тонкой инструкции для fork:

После успешного завершения fork () возвращает 0 дочернему процессу и возвращает идентификатор процесса дочернего процесса в родительский процесс.

Первая ветвь if является условием ошибки и будет выполнена в родительском процессе, если произошла ошибка. Вторая ветвь (pid == 0) выполняется в дочернем процессе, дочерний элемент выполняет небольшую служебную работу с сигналом и выполняет exec. Третья ветка находится в родительской, когда не было ошибки.

В родительском pid будет отличным от нуля, но в новом дочернем процессе pid будет нулевым.

2 голосов
/ 22 апреля 2011

Выполняется в дочернем процессе, где pid будет 0. http://linux.die.net/man/2/fork

1 голос
/ 22 апреля 2011

Fork возвращает pid дочернего процесса родительскому процессу и 0 - дочернему процессу. поэтому при запросе pid == 0 означает «это дочерний процесс?». Если это так, он выполняет программу, переданную через аргументы командной строки.

1 голос
/ 22 апреля 2011

Создан только один новый процесс; ребенок.

fork() в дочернем процессе возвращает 0, что вы и проверяете.

fork() в родительском процессе (ваш исходный процесс) возвращает pid дочернего процесса.

Проверяя возврат fork() для 0, вы узнаете, являетесь ли вы родителем или ребенком; ты ребенок, если это 0.

...