процесс выполнения fork () - PullRequest
       3

процесс выполнения fork ()

6 голосов
/ 16 февраля 2011

Как именно работает fork ()?

следующий код

#include <stdio.h>

int main (int argc, char const *argv[])
{
printf("Hi\n");
int i;
for(i = 1; i < argc; i++)
{
    printf("Argument %d is %s\n", i, argv[i]);
    fork();
    printf("Forked in for loop increment %d\n", i);
}


return 0;
}

дает следующий вывод

/ a.out hello world

Аргумент 1 привет

Разветвлено для приращения цикла 1

Аргумент 2 - это мир

Разветвлено для приращения цикла 2

Разветвлено для приращения цикла 1

Аргумент 2 - это мир

Разветвлено для приращения цикла 2

Разветвлено для приращения цикла 2

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

Ответы [ 2 ]

9 голосов
/ 16 февраля 2011

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

Общая идиома для вызова fork:

pid_t pid = fork();

switch (pid) {
  case -1:
    /* an error occurred, i.e. no child process created */
    handle_error();
  case 0:
    /* a return value of 0 means we're in the child process */
    do_child_stuff();
    break;  // or _exit()
  default:
    /* we're in the parent; pid is the child's process id */
    do_parent_stuff();
}

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

3 голосов
/ 16 февраля 2011

Имейте в виду, что число процессов будет расти в геометрической прогрессии, поэтому для 100 аргументов мы говорим о 1267650600228229401496703205376 процессах. Я надеюсь, что у вас действительно сильный ПК:).

Я отвечу на ваш комментарий здесь, возможно, он поможет вам понять вилку.

После каждого цикла вы удваиваете номер процесса. Поэтому после N циклов вы получите 2 ^ N процесса. Или после 100 циклов вы получите то большое число, которое я вам дал.

Кстати, вилочные бомбы - одна из самых распространенных DoS-атак вокруг:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...