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

Fork System Call C



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

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

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







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



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

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



пид_т виљушка(празнина);

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





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

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

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



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

интглавни(празнина) {
пид_т пид=виљушка();

ако(пид== 0) {
принтф ('Дете => ППИД: %д ПИД: %д н',гетппид(),гетпид());
излаз (ЕКСИТ_СУЦЦЕСС);
}
елсе ако(пид> 0) {
принтф ('Родитељ => ПИД: %д н',гетпид());
принтф („Чека се да се процес детета заврши. н');
чекати(НУЛА);
принтф ('Дечији процес је завршен. н');
}
елсе {
принтф ('Није могуће креирати подређени процес. н');
}

повратакЕКСИТ_СУЦЦЕСС;
}

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

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

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

празнинацхилдТаск() {
принтф ('Здраво Свете н');
}

празнинапарентТаск() {
принтф ('Главни задатак. н');
}

интглавни(празнина) {
пид_т пид=виљушка();

ако(пид== 0) {
цхилдТаск();
излаз (ЕКСИТ_СУЦЦЕСС);
}
елсе ако(пид> 0) {
чекати(НУЛА);
парентТаск();
}
елсе {
принтф („Није могуће креирати подређени процес.“);
}

повратакЕКСИТ_СУЦЦЕСС;
}

Излаз горњег програма:

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

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

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

интглавни(празнина) {
за(инти= 1;и<= 5;и++) {
пид_т пид=виљушка();

ако(пид== 0) {
принтф ('Подређени процес => ППИД =%д, ПИД =%д н',гетппид(),гетпид());
излаз (0);
}
елсе {
принтф ('Родитељски процес => ПИД =%д н',гетпид());
принтф („Чека се да се подређени процеси заврше ... н');
чекати(НУЛА);
принтф ('процес детета је завршен. н');
}
}

повратакЕКСИТ_СУЦЦЕСС;
}

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

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

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

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

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

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

интглавни(празнина) {
интфд[2];
цев(фд);
пид_т пид=виљушка();

ако(пид> 0) {
Близу(0);
Близу(фд[1]);
после(фд[0]);

интсецретНумбер;
сизе_треадБитес=читати(фд[0], &сецретНумбер, величина(сецретНумбер));

принтф („Чека се ПИН ... н');
чекати(НУЛА);
принтф ('Читани бајтови: %лд н',реадБитес);
принтф ('ПИН: %д н',сецретНумбер);
}
елсе ако(пид== 0) {
Близу(1);
Близу(фд[0]);
после(фд[1]);

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

повратакЕКСИТ_СУЦЦЕСС;
}

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

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