Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

#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 by stdio, также дублируется. "\n" в конце этого первого оператора печати может заставить его идти вперед и стирать stdout, но это не гарантируется.

Ответ 2

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

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

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

Ответ 3

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

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

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

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

int cProcessID;

cProcessID = fork();

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

Ответ 4

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

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

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

Ответ 5

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