c - код fork () - PullRequest
       16

c - код fork ()

6 голосов
/ 09 марта 2010
void main ()
{
   if ( fork () )
   {
       printf ( "PID1 %d\n", getpid () );
   }
   else
   {
       printf ( "PID2 %d\n", getpid () );
   }
}

Что делает этот код? Я знаю, что это как-то связано с идентификаторами процессов, но не должен ли fork возвращать что-либо в условие, чтобы определить, является ли это дочерним / родительским процессом?

Ответы [ 3 ]

16 голосов
/ 09 марта 2010

Обычно это:

pid_t pid = fork();
if(pid == 0) {
  //child
} else if(pid > 0) {
  //parent
} else {
 //error
}

На странице руководства написано:

RETURN VALUE
   Upon successful completion, fork() shall return 0 to the child 
   process and shall return the process ID of the child process to the 
   parent process.  Both processes shall continue to execute from 
   the fork() function. 
   Otherwise, -1 shall be returned to the parent process, no child process 
   shall be created, and errno shall be set to indicate the error.
3 голосов
/ 09 марта 2010

Приведенный выше код создает новый процесс, когда он выполняет вызов fork, этот процесс будет почти точной копией исходного процесса. Оба процесса будут продолжаться по отдельности в форме возврата, вызов fork, в связи с чем возникает вопрос: «Как узнать, новый ли это процесс или старый?». так как они почти идентичны. Для этого разработчики вил заставили вызов fork возвращать разные вещи в каждом процессе, в новом процессе (дочернем) вызов fork возвращает 0, а в исходном процессе (родительском) fork возвращает идентификатор нового процесса, чтобы родитель мог взаимодействовать с ним.

Таким образом, в коде вызов fork создает дочерний процесс, оба процесса выполняют оператор if отдельно. В родителе возвращаемое значение не равно нулю, поэтому родитель выполняет оператор if. У дочернего элемента возвращаемое значение равно 0, поэтому он выполняет оператор else. Надеюсь, это поможет: -)

0 голосов
/ 09 марта 2010

Возвращаемое значение fork () указывает, является ли процесс родительским или дочерним. Таким образом, потомок всегда будет печатать «PID2 0», потому что если fork () возвращает 0, выполняется вторая часть оператора if.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...