Как это возможно для fork(), чтобы вернуть два значения?

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

5 ответов

Решение

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

#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) необходимо, так как процесс дублируется с помощью fork, что означает, что буферизация для stdout с помощью stdio также дублируется. "\ N" в конце этого первого оператора печати может заставить его выполнить сброс стандартного вывода, но это не гарантируется.

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

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

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

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

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

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

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

int cProcessID;

cProcessID = fork();

if (cProcessID == 0) {
    // Child process
} else {
    // Parent process
}

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

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

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

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

Другие вопросы по тегам