Ц Програмирање

Форк системски позив у Ц

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

Слика 1: Основни ток форк ()

У овом чланку ћу вам показати како да користите системски позив форк () за креирање подређених процеса у Ц. Па, кренимо.

форк () Синтакса и повратна вредност:

Синтакса функције форк () система је следећа:

пид_т форк (воид);

Системска функција форк () не прихвата ниједан аргумент. Враћа цели број типа пид_т.

У успеху, форк () враћа ПИД подређеног процеса који је већи од 0. Унутар подређеног процеса, повратна вредност је 0. Ако форк () не успије, враћа -1.

Једноставна виљушка () Пример:

Једноставан пример форк () је дат у наставку:

#инцлуде
#инцлуде
#инцлуде
#инцлуде
#инцлуде
 
инт маин (воид)
пид_т пид = форк ();
 
иф (пид == 0)
принтф ("Цхилд => ППИД:% д ПИД:% д \ н", гетппид (), гетпид ());
излаз (ЕКСИТ_СУЦЦЕСС);

иначе ако (пид> 0)
принтф ("Родитељ => ПИД:% д \ н", гетпид ());
принтф ("Чекање да се подређени процес заврши.\ н ");
сачекајте (НУЛЛ);
принтф ("Подређени процес завршен.\ н ");

елсе
принтф ("Није могуће креирати подређени процес.\ н ");

 
ретурн ЕКСИТ_СУЦЦЕСС;

Овде сам помоћу форк () креирао подређени процес из главног / надређеног процеса. Затим сам од детета и родитеља отиснуо ПИД (ИД процеса) и ППИД (ИД родитељског процеса). У родитељском процесу чекање (НУЛЛ) користи се за чекање да се подређени процес заврши. У подређеном процесу, излаз () се користи за завршетак подређеног процеса. Као што видите, ПИД надређеног процеса је ППИД подређеног процеса. Дакле, процес детета 24738 припада родитељском процесу 24731.

Функције такође можете користити да свој програм учините модуларнијим. Ево, користио сам процессТаск () и парентТаск () функције за дете и родитеље. Тако се заправо користи форк ().

#инцлуде
#инцлуде
#инцлуде
#инцлуде
#инцлуде
 
воид цхилдТаск ()
принтф ("Здраво, свет \ н");

 
воид парентТаск ()
принтф ("Главни задатак.\ н ");

 
инт маин (воид)
пид_т пид = форк ();
 
иф (пид == 0)
цхилдТаск ();
излаз (ЕКСИТ_СУЦЦЕСС);

иначе ако (пид> 0)
сачекајте (НУЛЛ);
парентТаск ();

елсе
принтф ("Није могуће креирати подређени процес.");

 
ретурн ЕКСИТ_СУЦЦЕСС;

Резултат горе наведеног програма:

Покретање више подређених процеса помоћу форк () и Лооп:

Такође можете да користите петљу да креирате онолико подређених процеса колико вам је потребно. У примеру испод, креирао сам 5 подређених процеса користећи фор петљу. Такође сам штампао ПИД и ППИД из подређених процеса.

#инцлуде
#инцлуде
#инцлуде
#инцлуде
#инцлуде
 
инт маин (воид)
за (инт и = 1; и <= 5; i++)
пид_т пид = форк ();
 
иф (пид == 0)
принтф ("Подређени процес => ППИД =% д, ПИД =% д \ н", гетппид (), гетпид ());
излаз (0);

елсе
принтф ("Надређени процес => ПИД =% д \ н", гетпид ());
принтф ("Чекање да се подређени процеси заврше ... \ н");
сачекајте (НУЛЛ);
принтф ("подређени процес је завршен.\ н ");


 
ретурн ЕКСИТ_СУЦЦЕСС;

Као што видите, ИД надређеног процеса је исти у свим подређеним процесима. Дакле, сви они припадају истом родитељу. Такође се извршавају линеарно. Један за другим. Контрола дечијих процеса је софистициран задатак. Ако сазнате више о програмирању Линук система и како то функционише, моћи ћете да контролишете ток ових процеса како год желите.

Пример из стварног живота:

Различита сложена математичка израчунавања као што су мд5, сха256 итд. Генерисање хеша захтевају велику процесорску снагу. Уместо да рачунате такве ствари у истом процесу као и главни програм, можете само израчунати хеш на подређеном процесу и вратити хеш у главни процес.

У следећем примеру сам генерисао четвороцифрени ПИН код у подређеном процесу и послао га надређеном процесу, главном програму. Затим сам одатле одштампао ПИН код.

#инцлуде
#инцлуде
#инцлуде
#инцлуде
#инцлуде
 
инт гетПИН ()
// користимо ППИД и ПИД као семе
сранд (гетпид () + гетппид ());
инт тајна = 1000 + ранд ()% 9000;
повратна тајна;

 
инт маин (воид)
инт фд [2];
цев (фд);
пид_т пид = форк ();
 
иф (пид> 0)
затвори (0);
затвори (фд [1]);
дуп (фд [0]);
 
инт сецретНумбер;
сизе_т реадБитес = реад (фд [0], & сецретНумбер, сизеоф (сецретНумбер));
 
принтф ("Чека се ПИН ... \ н");
сачекајте (НУЛЛ);
принтф ("Прочитано бајтова:% лд \ н", реадБитес);
принтф ("ПИН:% д \ н", тајни број);

иначе ако (пид == 0)
затвори (1);
затвори (фд [0]);
дуп (фд [1]);
 
инт тајна = гетПИН ();
врите (фд [1], & сецрет, сизеоф (сецрет));
излаз (ЕКСИТ_СУЦЦЕСС);

 
ретурн ЕКСИТ_СУЦЦЕСС;

Као што видите, сваки пут када покренем програм, добијем другачији 4-цифрени ПИН код.

Дакле, тако се у основи користи системски позив форк () у Линуку. Хвала што сте прочитали овај чланак.

ХД Ремастеред игре за Линук које никада раније нису имале Линук издање
Многи програмери и издавачи игара долазе са ХД ремастером старих игара како би продужили живот франшизе, молимо обожаваоце да захтевају компатибилност...
Како користити АутоКеи за аутоматизацију Линук игара
АутоКеи је услужни програм за аутоматизацију радне површине за Линук и Кс11, програмиран на Питхон 3, ГТК и Кт. Користећи његову скриптну и МАЦРО функ...
Како приказати бројач ФПС-а у Линук играма
Линук гаминг добио је велики потицај када је Валве најавио Линук подршку за Стеам клијент и њихове игре 2012. године. Од тада су многе ААА и индие игр...