Форк Систем Цалл Линук

Fork System Call Linux



Системски позив виљушке се користи за креирање нових процеса. Новонастали процес је подређени процес. Процес који позива форк и ствара нови процес је родитељски процес. Подређени и родитељски процеси се извршавају истовремено.

Али процеси детета и родитеља налазе се на различитим меморијским просторима. Ови меморијски простори имају исти садржај и било која операција коју изврши један процес неће утицати на други процес.







Када се стварају процеси детета; сада ће оба процеса имати исти програмски бројач (ПЦ), па ће оба процеса указати на исту следећу инструкцију. Датотеке које отвара родитељски процес биће исте за подређени процес.



Подређени процес је потпуно исти као и његов родитељ, али постоје разлике у ИД -овима процеса:



  1. ИД процеса подређеног процеса је јединствени ИД процеса који се разликује од ИД -а свих других постојећих процеса.
  2. ИД родитељског процеса биће исти као ИД процеса родитељског детета.

Особине процеса детета

Ово су нека од својстава која подређени процес поседује:





  1. Бројачи ЦПУ -а и коришћење ресурса се иницијализују да би се вратили на нулу.
  2. Када се родитељски процес заврши, подређени процеси не примају никакав сигнал јер је атрибут ПР_СЕТ_ПДЕАТХСИГ у прцтл () ресетован.
  3. Нит који се користи за позивање форк () ствара подређени процес. Дакле, адреса процеса детета ће бити иста као адреса родитеља.
  4. Дескриптор датотеке надређеног процеса наслеђује подређени процес. На пример, помак датотеке или статус заставица и И/О атрибути ће се делити међу дескрипторима датотека подређених и надређених процеса. Тако ће се дескриптор датотеке родитељске класе односити на исти дескриптор датотеке подређене класе.
  5. Дескриптори редова отворених порука родитељског процеса наслеђују подређени процес. На пример, ако дескриптор датотеке садржи поруку у родитељском процесу, иста порука ће бити присутна у одговарајућем дескриптору датотеке подређеног процеса. Дакле, можемо рећи да су вредности заставица ових дескриптора датотека исте.
  6. Слично, отворени токови директоријума ће бити наслеђени подређеним процесима.
  7. Подразумевана вредност попуштања тајмера подређене класе је иста као тренутна вредност попуштања тајмера родитељске класе.

Својства која нису наслеђена Цхилд процесом

Ово су нека од својстава која нису наслеђена подређеним процесом:

  1. Закључавање меморије
  2. Чекајући сигнал подређене класе је празан.
  3. Обради закључане записе (фцнтл ())
  4. Асинхроне И/О операције и И/О садржај.
  5. Обавештења о промени именика.
  6. Тајмери ​​као што су аларм (), сетитимер () нису наслеђени од стране подређене класе.

форк () у Ц.

У форк () нема аргумената, а повратни тип форк () је цео број. Када се користи форк (), морате укључити следеће датотеке заглавља:



#инцлуде
#инцлуде
#инцлуде

Приликом рада са виљушком (), може се користити за тип пид_т за процесе ИД -а као што је пид_т дефинисан у.

Заглавље је место где је форк () дефинисан па га морате укључити у програм да бисте користили форк ().

Врста повратка је дефинисана у, а позив форк () дефинисан је у. Због тога морате да укључите обоје у свој програм да бисте користили системски позив форк ().

Синтакса форк ()

Синтакса системског позива форк () у Линуку, Убунту је следећа:

пид_т виљушка (воид);

У синтакси је тип повратка пид_т . Када се подређени процес успешно креира, ПИД подређеног процеса се враћа у родитељски процес, а 0 ће се вратити у сам подређени процес.

Ако дође до грешке, -1 се враћа у родитељски процес, а подређени процес се не креира.

No arguments are passed to fork(). 

Пример 1: Позивна виљушка ()

Размотримо следећи пример у којем смо користили системски позив форк () за креирање новог подређеног процеса:

КОД:

#инцлуде
#инцлуде
#инцлуде

интглавни()
{
виљушка();
принтф ('Коришћење системског позива форк () н');
повратак 0;
}

ИЗЛАЗНИ ПОДАЦИ:

Коришћење системског позива форк ()
Коришћење системског позива форк ()

У овом програму смо користили форк (), ово ће створити нови подређени процес. Када се креира подређени процес, и родитељски и подређени процес ће показати следећу инструкцију (исти програмски бројач). На овај начин ће се преостале инструкције или Ц наредбе извршити укупан број процеса, односно 2нпута, где је н број системских позива форк ().

Дакле, када се позив форк () користи једном као горе (21= 2) имаћемо наш излаз 2 пута.

Овде када се користи системски позив форк (), унутрашња структура ће изгледати овако:

Размотримо следећи случај у коме се виљушка () користи 4 пута:

КОД:

#инцлуде
#инцлуде
#инцлуде

интглавни()
{
виљушка();
виљушка();
виљушка();
виљушка();
принтф ('Коришћење системског позива форк ()');
повратак 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: Тестирање да ли је форк () био успешан

У следећем примеру користили смо конструкцију за доношење одлука да бисмо тестирали вредност (инт) коју враћа форк (). Приказују се и одговарајуће поруке:

КОД:

#инцлуде
#инцлуде
#инцлуде

интглавни()
{
пид_т п;
п=виљушка();
ако(п== -1)
{
принтф ('Дошло је до грешке при позивању форк ()');
}
ако(п==0)
{
принтф ('Ми смо у процесу детета');
}
елсе
{
принтф ('Ми смо у родитељском процесу');
}
повратак 0;
}

ИЗЛАЗНИ ПОДАЦИ:

Ми смо у родитељском процесу
Ми смо у процесу детета

У горњем примеру смо користили тип пид_т који ће сачувати повратну вредност форк (). форк () се позива на мрежи:

п=виљушка();

Дакле, целобројна вредност коју враћа форк () се складишти у п, а затим се п упоређује да би се проверило да ли је наш позив форк () био успешан.

Када се позив форк () користи и дете успешно креира, ИД подређеног процеса ће се вратити у родитељски процес, а 0 у подређени процес. ИД подређеног процеса у родитељском процесу неће бити исти као ИД процеса детета у самом процесу детета. У подређеном процесу ИД подређеног процеса ће бити 0.

Помоћу овог водича можете видети како започети са системским позивом форк у линук -у.