Systémový hovor vidlice v C.

Fork System Call C



systémové volanie fork () sa používa na vytváranie podradených procesov v programe C. fork () sa používa tam, kde je vo vašej aplikácii požadované paralelné spracovanie. Funkcia systému fork () je definovaná v hlavičkách sys/types.h a unistd.h . V programe, kde používate fork, musíte použiť aj systémové volanie wait (). systémové volanie wait () slúži na čakanie v rodičovskom procese na dokončenie podradeného procesu. Na dokončenie podradeného procesu sa v podradenom procese použije systémové volanie exit (). V hlavičke je definovaná funkcia wait () sys/počkať.h a funkcia exit () je definovaná v hlavičke stdlib.h .

Obr. 1: Základný pracovný postup fork ()

Obr. 1: Základný pracovný postup fork ()







V tomto článku vám ukážem, ako pomocou systémového volania fork () vytvárať podriadené procesy v jazyku C. Takže začnime.



fork () Syntax a návratová hodnota:

Syntax systémovej funkcie fork () je nasledovná:



vidlica pid_t(prázdny);

Systémová funkcia fork () neakceptuje žiadny argument. Vráti celé číslo typu pid_t .





Pri úspechu vráti fork () PID podradeného procesu, ktorý je väčší ako 0. Vnútri podradeného procesu je návratová hodnota 0. Ak fork () zlyhá, vráti -1.

Jednoduchá vidlica () Príklad:

Jednoduchý príklad fork () je uvedený nižšie:



#zahrnúť
#zahrnúť
#zahrnúť
#zahrnúť
#zahrnúť

intHlavná(prázdny) {
pid_t pid=vidlička();

keby(pid== 0) {
printf („Dieťa => PPID: %d PID: %d n',getppid(),dostať sa());
východ (EXIT_SUCCESS);
}
inak keby(pid> 0) {
printf ('Rodič => PID: %d n',dostať sa());
printf („Čakanie na dokončenie procesu dieťaťa. n');
počkaj(NULOVÝ);
printf („Proces dieťaťa sa skončil. n');
}
inak {
printf („Nie je možné vytvoriť podradený proces. n');
}

vrátiť saEXIT_SUCCESS;
}

Tu som použil fork () na vytvorenie podradeného procesu z hlavného/nadradeného procesu. Potom som vytlačil PID (ID procesu) a PPID (ID rodičovského procesu) z podradeného a nadradeného procesu. Na rodičovskom procese wait (NULL) sa používa na čakanie na dokončenie podradeného procesu. V podradenom procese sa na dokončenie podradeného procesu používa exit (). Ako vidíte, PID nadradeného procesu je PPID podradeného procesu. Proces dieťaťa 24738 patrí do rodičovského procesu 24731 .

Môžete tiež použiť funkcie na zvýšenie modulárnosti programu. Tu som použil processTask () a parentTask () funkcie pre dieťa a rodičovské procesy. Takto sa vlastne používa fork ().

#zahrnúť
#zahrnúť
#zahrnúť
#zahrnúť
#zahrnúť

prázdnychildTask() {
printf ('Ahoj svet n');
}

prázdnyparentTask() {
printf ('Hlavná úloha. n');
}

intHlavná(prázdny) {
pid_t pid=vidlička();

keby(pid== 0) {
childTask();
východ (EXIT_SUCCESS);
}
inak keby(pid> 0) {
počkaj(NULOVÝ);
parentTask();
}
inak {
printf ('Nie je možné vytvoriť podradený proces.');
}

vrátiť saEXIT_SUCCESS;
}

Výstup vyššie uvedeného programu:

Spustenie viacerých podradených procesov pomocou vidlice () a slučky:

Pomocou slučky môžete tiež vytvoriť toľko podriadených procesov, koľko potrebujete. V nižšie uvedenom príklade som vytvoril 5 podradených procesov pomocou cyklu for. Tiež som vytlačil PID a PPID z podradených procesov.

#zahrnúť
#zahrnúť
#zahrnúť
#zahrnúť
#zahrnúť

intHlavná(prázdny) {
pre(inti= 1;i<= 5;i++) {
pid_t pid=vidlička();

keby(pid== 0) {
printf („Podradený proces => PPID =%d, PID =%d n',getppid(),dostať sa());
východ (0);
}
inak {
printf („Nadradený proces => PID =%d n',dostať sa());
printf („Čakanie na dokončenie podradených procesov ... n');
počkaj(NULOVÝ);
printf („detský proces sa skončil. n');
}
}

vrátiť saEXIT_SUCCESS;
}

Ako vidíte, ID rodičovského procesu je rovnaké vo všetkých podradených procesoch. Všetci teda patria tomu istému rodičovi. Vykonávajú tiež lineárnym spôsobom. Jeden za druhým. Riadenie detských procesov je náročná úloha. Ak sa dozviete viac o programovaní systému Linux a jeho fungovaní, budete môcť tok týchto procesov ovládať tak, ako chcete.

Príklad zo skutočného života:

Rôzne komplexné matematické výpočty, ako sú md5, sha256 atď., Hash generovanie vyžaduje veľa výpočtového výkonu. Namiesto toho, aby ste také veci počítali v rovnakom procese ako hlavný program, môžete iba vypočítať hash podradeného procesu a vrátiť hash do hlavného procesu.

V nasledujúcom príklade som vygeneroval 4-miestny PIN kód v podradenom procese a odoslal ho do nadradeného procesu, hlavného programu. Potom som odtiaľ vytlačil PIN kód.

#zahrnúť
#zahrnúť
#zahrnúť
#zahrnúť
#zahrnúť

intgetPIN() {
// ako východisko použite PPID a PID
srand (dostať sa() +getppid());
inttajomstvo= 1 000 + riadok () % 9000;
vrátiť satajomstvo;
}

intHlavná(prázdny) {
intfd[2];
rúra(fd);
pid_t pid=vidlička();

keby(pid> 0) {
Zavrieť(0);
Zavrieť(fd[1]);
po(fd[0]);

intsecretNumber;
veľkosť_treadBytes=čítať(fd[0], &secretNumber, veľkosť(secretNumber));

printf („Čakanie na kód PIN ... n');
počkaj(NULOVÝ);
printf ('Načítané bajty: %ld n',readBytes);
printf ('PIN: %d n',secretNumber);
}
inak keby(pid== 0) {
Zavrieť(1);
Zavrieť(fd[0]);
po(fd[1]);

inttajomstvo=getPIN();
písať(fd[1], &tajomstvo, veľkosť(tajomstvo));
východ (EXIT_SUCCESS);
}

vrátiť saEXIT_SUCCESS;
}

Ako vidíte, pri každom spustení programu dostanem iný 4-miestny PIN kód.

V podstate teda v Linuxe používate systémové volanie fork (). Ďakujem za prečítanie tohto článku.