Системный вызов fork ()

Spread the love

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

  • Если fork () возвращает процесс неограниченной стоимости.
  • fork () возвращает ноль к вновь созданному дочернему процессу.
  • fork () возвращает положительное значение, идентификатор процесса дочернего процесса Возвращенный идентификатор процесса имеет тип pid_t определенных в sys / types.h , Обычно идентификатор процесса является целым числом. Более того, процесс может использовать функцию getpid () для получения идентификатора процесса, присвоенного этому процессу.

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

Возьмем пример. В этом примере не различаются родительские и дочерние процессы. Нажмите Вот скачать этот файл вилочных 01.c , Предположим, что программа выполнена. fork () (отмечен красным цветом):

Если вызов fork () выполняется успешно, unix будет

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

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

В чем причина использования записывать скорее, чем Printf? Потому что printf () «буферизировано», что означает printf () объединит результат процесса. Ребенок также может использовать Printf для печати некоторой информации, которая также будет буферизирована. Вы не можете получить правильный порядок результата. Хуже того, выход можно смешивать странными способами. Чтобы преодолеть эту проблему, вы можете рассмотреть возможность использования "небуферизованных" записывать.

Если вы используете эту программу, вы не сможете ее получить. В связи с тем, что эти процессы запускаются, их выходные линии смешиваются довольно непредсказуемым образом. Более того, порядок этих строк определяется планировщиком ЦП. Следовательно, если вы снова запустите эту программу, вы можете получить совершенно другой результат.

Рассмотрим еще один простой пример, который отличает родителя от ребенка. Нажмите Вот скачать этот файл вилочных 02.c , В этой программе можно использовать оба процесса. я, Для простоты, printf () используется.

Когда основная программа выполняется fork ()Это копия адресного пространства. Системный вызов fork () возвращает идентификатор дочернего процесса. Существует переменная ПИД-регулятор, Получает идентификационный номер от 3456.

Теперь обе программы (то естьНиже приводится утверждение:

В родительском ПИД-регулятор не равен нулю, он вызывает функцию ParentProcess (), У ребенка есть нуль ПИД-регулятор и звонки ChildProcess () как показано ниже:

В случае скребка, напечатанного другим процессом. Следовательно, значение MAX_COUNT Он должен быть достаточно большим, чтобы уйти. Если значение MAX_COUNT Его можно использовать для его приготовления в течение одного раза.

Ссылка на основную публикацию
close-link