Так как функция в C возвращает только одно значение, все время, как fork()
, которая также является функцией, возвращает два значения?
Как можно fork() вернуть два значения?
Ответ 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
- единственный способ отличить, в каком процессе вы находитесь - родительский или дочерний.