Как это возможно для fork (), чтобы вернуть два значения? - PullRequest
14 голосов
/ 17 ноября 2010

Поскольку функция в C возвращает только одно значение, все время, как может fork(), который также является функцией, возвращать два значения?

Ответы [ 5 ]

19 голосов
/ 17 ноября 2010

Функция fork возвращает 0 для созданного дочернего процесса и возвращает идентификатор дочернего процесса для родительского процесса.

Каждый из двух отдельных процессов возвращает одно значение.

Так что думайте об этом больше как об одном возврате, вызываемом в каждом потоке процессе.

13 голосов
/ 17 ноября 2010

Как говорит Gnostus , функция fork () не возвращает двух значений.

То, что она делает, возвращает одно значение, как и все функции, но возвращается дважды.

Один раз в родительском процессе и один раз в дочернем.Родительский процесс получает идентификатор дочернего процесса, возвращенный ему, дочерний процесс получает 0 - недопустимый идентификатор процесса, поэтому код может сказать, что это дочерний процесс.

Дочерний процесс - это новый процесс, выполняющий тот же коднаходится в том же месте в коде, что и родитель, который его породил.

int cProcessID;

cProcessID = fork();

if (cProcessID == 0) {
    // Child process
} else {
    // Parent process
}
9 голосов
/ 17 ноября 2010

Если вы читаете, собираете и запускаете следующую программу, вы должны лучше понять, что происходит.

#include <stdio.h>
#include <unistd.h>

int main(void) {
    pid_t fk;

    printf("\tbefore fork my pid = %lu\n", (unsigned long)getpid() );

    fflush(stdout); /* This may keep the above print
                       statement from outputing twice. */

    fk = fork(); /* The OS kernel makes a copy of the current process here */

    printf("fork returned %lu and now my pid = %lu\n",
                         (unsigned long)fk, (unsigned long)getpid() );

    return 0;
}

Причина, по которой fflush(stdout) необходим, заключается в том, что процессдублируется вилкой, что означает, что буферизация для stdout с помощью stdio также дублируется.«\ N» в конце этого первого оператора печати может заставить его выполнить сброс стандартного вывода, но это не гарантируется.

8 голосов
/ 17 ноября 2010

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

ОС организует для fork()вернуть в родительский процесс с pid дочернего процесса, а для него - в дочерний процесс с нулем (если дела идут хорошо).

Именно поэтому они говорят, что fork() возвращается дважды.Один раз в каждом процессе.

5 голосов
/ 17 ноября 2010

fork не возвращает двух значений. Сразу после системного вызова fork у вас просто два независимых процесса, выполняющих один и тот же код, и возвращенный pid из fork - единственный способ определить, в каком процессе вы находитесь - родитель или потомок.

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