Что именно возвращает вилка? - PullRequest
18 голосов
/ 07 апреля 2011

В случае успеха, PID ребенка процесс возвращается в родительском поток выполнения, а 0 возвращается в дочернюю нить исполнения.

p = fork();

Я запутался на странице справочника, p равно 0 или PID?

Ответы [ 8 ]

48 голосов
/ 07 апреля 2011

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

Таким образом, каноническое использование выглядит следующим образом:

p = fork();
if (0 == p)
{
    // We're the child process
}
else if (p > 0)
{
    // We're the parent process
}
else
{
    // We're the parent process, but child couldn't be created
}
29 голосов
/ 07 апреля 2011
                             p = fork();
                        /* assume no errors */
                        /* you now have two */
                        /* programs running */
                         --------------------
      if (p > 0) {                |            if (p == 0) {
        printf("parent\n");       |              printf("child\n");
        ...                       |              ...
8 голосов
/ 07 апреля 2011

После выполнения fork у вас есть два процесса.Вызов возвращает разные значения для каждого процесса.

Если вы сделаете что-то подобное

int f;
f = fork();
if (f == 0) {
  printf("I am the child\n");
} else {
  printf("I am the parent and the childs pid is %d\n",f);

}

Вы увидите оба сообщения напечатаны.Они печатаются двумя отдельными процессами.Таким образом, вы можете различить два созданных процесса.

6 голосов
/ 08 апреля 2011

Процессы структурированы в направленном дереве , где вы знаете только своего единственного родителя (getppid()). Короче говоря, fork() возвращает <strong>-1</strong> при ошибке, как и многие другие системные функции, ненулевое значение полезно, чтобы инициатор вызова fork (родительский) знал свой pid new-child.

Ничто так не хорошо, как пример:

/* fork/getpid test */
#include <sys/types.h>
#include <unistd.h>     /* fork(), getpid() */
#include <stdio.h>

int main(int argc, char* argv[])
{
    int pid;

    printf("Entry point: my pid is %d, parent pid is %d\n",
           getpid(), getppid());

    pid = fork();
    if (pid == 0) {
        printf("Child: my pid is %d, parent pid is %d\n",
               getpid(), getppid());
    }
    else if (pid > 0) {
        printf("Parent: my pid is %d, parent pid is %d, my child pid is %d\n",
               getpid(), getppid(), pid);
    }
    else {
        printf("Parent: oops! can not create a child (my pid is %d)\n",
               getpid());
    }

    return 0;
}

И результат (в данном случае bash - это pid 2249):

Entry point: my pid is 16051, parent pid is 2249
Parent: my pid is 16051, parent pid is 2249, my child pid is 16052
Child: my pid is 16052, parent pid is 16051

Если вам нужно разделить некоторые ресурсы (файлы, родительский pid и т. Д.) Между родителем и потомком, посмотрите на clone() (для библиотеки GNU C и, возможно, других)

4 голосов
/ 07 апреля 2011

Это классная часть. Это равно ОБА.

Ну, не совсем. Но как только fork вернется, теперь у вас запущены две копии вашей программы! Два процесса. Вы можете рассматривать их как альтернативные вселенные. В одном возвращаемое значение 0. В другом - это ID нового процесса!

Обычно у вас будет что-то вроде этого:

p = fork();
if (p == 0){
    printf("I am a child process!\n");
    //Do child things
}
else {
    printf("I am the parent process! Child is number %d\n", p);
    //Do parenty things
}

В этом случае обе строки будут напечатаны, но разными способами!

1 голос
/ 05 августа 2014

Fork создает дубликат процесса и новый контекст процесса.Когда он возвращает значение 0, это означает, что дочерний процесс выполняется, но когда он возвращает другое значение, которое означает, что родительский процесс выполняется.Обычно мы используем оператор ожидания, чтобы завершить дочерний процесс и начать выполнение родительского процесса.

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

fork() вызывается в родительском процессе. Затем создается дочерний процесс. К тому времени, когда порождается дочерний процесс, fork() завершает свое выполнение.

На данный момент, fork() готов к возврату, но возвращает другое значение в зависимости от того, находится ли он в родительском или дочернем элементе. В дочернем процессе он возвращает 0, а в родительском процессе / потоке он возвращает идентификатор дочернего процесса.

0 голосов
/ 14 марта 2016

Я думаю, что это работает так: когда pid = fork (), код должен выполняться два раза, один в текущем процессе, другой в дочернем процессе. Таким образом, это объясняет, почему, если / иначе оба выполняются. И порядок, сначала текущий процесс, а затем выполнить дочерний процесс.

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