Fork System Call Linux

Fork System Call Linux



Системното извикване на вилицата се използва за създаване на нови процеси. Новосъздаденият процес е дъщерния процес. Процесът, който извиква вилица и създава нов процес, е родителският процес. Дочерните и родителските процеси се изпълняват едновременно.

Но децата и родителските процеси се намират в различни пространства на паметта. Тези пространства на паметта имат същото съдържание и каквато и да е операция, извършена от един процес, няма да повлияе на другия процес.







Когато се създават дочерните процеси; сега и двата процеса ще имат един и същ програмен брояч (PC), така че и двата процеса ще сочат към същата следваща инструкция. Файловете, отворени от родителския процес, ще бъдат същите за дъщерния процес.



Дочерният процес е абсолютно същият като неговия родител, но има разлика в идентификаторите на процесите:



  1. Идентификаторът на процеса на дъщерния процес е уникален идентификационен номер на процеса, който е различен от идентификационния номер на всички други съществуващи процеси.
  2. Идентификаторът на родителския процес ще бъде същият като този на идентификатора на процеса на родителя на детето.

Свойства на детския процес

По -долу са някои от свойствата, които притежава дъщерният процес:





  1. Броячите на процесора и използването на ресурсите се инициализират за нулиране.
  2. Когато родителският процес е прекратен, дъщерните процеси не получават никакъв сигнал, защото атрибутът PR_SET_PDEATHSIG в prctl () се нулира.
  3. Нишката, използвана за извикване на fork (), създава дъщерния процес. Така че адресът на дъщерния процес ще бъде същият като този на родителя.
  4. Файловият дескриптор на родителския процес се наследява от дъщерния процес. Например изместването на файла или състоянието на флаговете и I/O атрибутите ще бъдат споделени между файловите дескриптори на дъщерни и родителски процеси. Така че файловият дескриптор на родителския клас ще се позовава на същия дескриптор на файлове на дъщерния клас.
  5. Дескрипторите на опашката с отворени съобщения на родителския процес се наследяват от дъщерния процес. Например, ако дескриптор на файл съдържа съобщение в родителския процес, същото съобщение ще присъства в съответния дескриптор на файл на дъщерния процес. Така че можем да кажем, че флаговите стойности на тези файлови дескриптори са еднакви.
  6. По същия начин отворените потоци от директории ще бъдат наследени от дъщерните процеси.
  7. Стойността на отпускане на таймера по подразбиране на дъщерния клас е същата като текущата стойност на отслабване на таймера на родителския клас.

Свойства, които не са наследени от дъщерния процес

По -долу са някои от свойствата, които не са наследени от дъщерния процес:

  1. Заключване на паметта
  2. Изчакващият сигнал на дъщерния клас е празен.
  3. Обработка на свързани заключвания на записи (fcntl ())
  4. Асинхронни I/O операции и I/O съдържание.
  5. Известия за промяна на директория.
  6. Таймери като alarm (), setitimer () не се наследяват от дъщерния клас.

вилица () в C

Няма аргументи във fork () и връщащият тип fork () е цяло число. Когато се използва fork (), трябва да включите следните заглавни файлове:



#включва
#включва
#включва

Когато работите с вилица (), може да се използва за тип pid_t за ID на процесите като pid_t е дефиниран в.

Заглавният файл е мястото, където fork () е дефиниран, така че трябва да го включите в програмата си, за да използвате fork ().

Типът на връщане е дефиниран в и извикването на fork () е дефинирано в. Следователно, трябва да включите и двете в програмата си, за да използвате системно извикване fork ().

Синтаксис на вилица ()

Синтаксисът на системния разговор fork () в Linux, Ubuntu е следният:

вилка pid_t (невалидна);

В синтаксиса връщащият тип е pid_t . Когато дъщерният процес е успешно създаден, PID на дъщерния процес се връща в родителския процес и 0 ще бъде върнат в самия дъщерен процес.

Ако има някаква грешка, -1 се връща към родителския процес и дъщерният процес не се създава.

No arguments are passed to fork(). 

Пример 1: Вилична вилка ()

Помислете за следния пример, в който използвахме системния извикване fork (), за да създадем нов дъщерен процес:

КОД:

#включва
#включва
#включва

intглавен()
{
вилица();
printf ('Използване на системно извикване fork ()н');
връщане 0;
}

ИЗХОД:

Използване на системно извикване fork ()
Използване на системно извикване fork ()

В тази програма използвахме fork (), това ще създаде нов дъщерен процес. Когато се създава дъщерния процес, и родителският процес, и дъщерният процес ще сочат към следващата инструкция (същия брояч на програмата). По този начин останалите инструкции или изрази C ще бъдат изпълнени общия брой времена на процеса, тоест 2нпъти, където n е броят на системните извиквания на fork ().

Така че, когато извикването fork () се използва веднъж както по -горе (21= 2) ще имаме изхода 2 пъти.

Тук, когато се използва системното извикване fork (), вътрешната структура ще изглежда така:

Помислете за следния случай, при който вилицата () се използва 4 пъти:

КОД:

#включва
#включва
#включва

intглавен()
{
вилица();
вилица();
вилица();
вилица();
printf ('Използване на системно извикване fork ()');
връщане 0;
}

Изход:

Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call 

Сега общият брой на създадените процеси е 24= 16, а нашето изявление за печат е изпълнено 16 пъти.

Пример 2: Тестване дали fork () е успешен

В следващия пример използвахме конструкцията за вземане на решения, за да тестваме стойността (int), върната от fork (). И съответните съобщения се показват:

КОД:

#включва
#включва
#включва

intглавен()
{
pid_t p;
стр=вилица();
ако(стр== -1)
{
printf ('Има грешка при извикване на fork ()');
}
ако(стр==0)
{
printf („Ние сме в детския процес“);
}
иначе
{
printf („Ние сме в родителския процес“);
}
връщане 0;
}

ИЗХОД:

Ние сме в родителския процес
Ние сме в детския процес

В горния пример използвахме типа pid_t, който ще съхранява връщаната стойност на fork (). fork () се извиква онлайн:

стр=вилица();

Така че целочислената стойност, върната от fork (), се съхранява в p и след това p се сравнява, за да се провери дали нашето повикване fork () е било успешно.

Когато се използва извикването fork () и детето е създадено успешно, идентификаторът на дъщерния процес ще бъде върнат в родителския процес и 0. ще бъде върнат в дъщерния процес. Идентификаторът на дъщерния процес в родителския процес няма да бъде същият като ИД на дъщерния процес в самия детски процес. В дъщерния процес идентификаторът на дъщерния процес ще бъде 0.

С този урок можете да видите как да започнете със системното обаждане на вилка в Linux.