Что именно возвращает вилка?

При успехе PID ребенка процесс возвращается родителям поток выполнения, а 0 -        возвращается в потоке выполнения childs.

p = fork();

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

Ответы

Ответ 1

Я не уверен, что руководство может быть более ясным! 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
}

Ответ 2

                             p = fork();
                        /* assume no errors */
                        /* you now have two */
                        /* programs running */
                         --------------------
      if (p > 0) {                |            if (p == 0) {
        printf("parent\n");       |              printf("child\n");
        ...                       |              ...

Ответ 3

Как только 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);

}

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

Ответ 4

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

Ничего не лучше, чем пример:

/* 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 и, возможно, другие)

Ответ 5

Это крутая часть. Он равен BOTH.

Ну, не совсем. Но как только 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
}

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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