Какова цель fork ()? - PullRequest
80 голосов
/ 12 июня 2009

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

Ответы [ 15 ]

1 голос
/ 25 марта 2017

Сначала нужно понять, что такое системный вызов fork (). Позвольте мне объяснить

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

  2. Системный вызов Fork копирует память на основе копирования при записи, что означает, что дочерний элемент создает на странице виртуальной памяти, когда есть необходимость копирования.

Теперь назначение fork ():

  1. Fork () может использоваться в месте, где есть разделение работы, так как сервер должен обрабатывать несколько клиентов, поэтому родительский узел должен принимать соединение на регулярной основе, поэтому сервер выполняет форк для каждого клиента для выполнения чтения-записи .
1 голос
/ 12 июня 2009

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

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

0 голосов
/ 20 января 2019

Обоснование использования fork () по сравнению с просто наличием функции exec () для запуска нового процесса объясняется в ответе на аналогичный вопрос об обмене стеками Unix .

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

В отличие от этого, в операционной системе Windows программистам приходится использовать функцию CreateProcess, которая НАМНОГО сложнее и требует заполнения разнообразной структуры для определения параметров нового процесса.

Итак, подведем итог: причина разветвления (а не исполнения) - простота в создании новых процессов.

0 голосов
/ 11 февраля 2018

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

  • Ребенок имеет уникальный PID, как и любой другой процесс, выполняющийся в операционная система.

  • У дочернего процесса есть идентификатор родительского процесса, который совпадает с PID
    процесс, который его создал.

  • Счетчики использования ресурсов и времени ЦП сбрасываются на ноль у дочерних элементов процесс.

  • Набор ожидающих сигналов у дочернего элемента пуст.

  • Ребенок не наследует таймеры от своего родителя

Пример:

    #include <unistd.h>
    #include <sys/types.h>
    #include <errno.h>
    #include <stdio.h>
    #include <sys/wait.h>
    #include <stdlib.h>

    int var_glb; /* A global variable*/

int main(void)
{
    pid_t childPID;
    int var_lcl = 0;

    childPID = fork();

    if(childPID >= 0) // fork was successful
    {
        if(childPID == 0) // child process
        {
            var_lcl++;
            var_glb++;
            printf("\n Child Process :: var_lcl = [%d], var_glb[%d]\n", var_lcl, var_glb);
        }
        else //Parent process
        {
            var_lcl = 10;
            var_glb = 20;
            printf("\n Parent process :: var_lcl = [%d], var_glb[%d]\n", var_lcl, var_glb);
        }
    }
    else // fork failed
    {
        printf("\n Fork failed, quitting!!!!!!\n");
        return 1;
    }

    return 0;
}

Теперь, когда приведенный выше код скомпилирован и запущен:

$ ./fork

Parent process :: var_lcl = [10], var_glb[20]

Child Process :: var_lcl = [1], var_glb[1]
0 голосов
/ 11 февраля 2018

Системный вызов Fork () используется для создания дочернего процесса. Это точная копия родительского процесса. Вилка копирует секцию стека, секцию кучи, секцию данных, переменную среды, аргументы командной строки из родительского элемента.

см .: http://man7.org/linux/man-pages/man2/fork.2.html

...