Volání systému vidlice v C.

Fork System Call C



systémové volání fork () se používá k vytváření podřízených procesů v programu C. fork () se používá tam, kde je ve vaší aplikaci vyžadováno paralelní zpracování. Funkce systému fork () je definována v záhlaví sys/types.h a unistd.h . V programu, kde používáte fork, musíte také použít systémové volání wait (). systémové volání wait () slouží k čekání v nadřazeném procesu na dokončení podřízeného procesu. K dokončení podřízeného procesu se v podřízeném procesu použije systémové volání exit (). Funkce wait () je definována v záhlaví sys/počkejte. h a funkce exit () je definována v záhlaví stdlib.h .

Obrázek 1: Základní pracovní postup fork ()

Obrázek 1: Základní pracovní postup fork ()







V tomto článku vám ukážu, jak pomocí systémového volání fork () vytvářet podřízené procesy v C. Takže pojďme začít.



fork () Syntaxe a návratová hodnota:

Syntaxe systémové funkce fork () je následující:



vidlice pid_t(prázdné);

Systémová funkce fork () nepřijímá žádný argument. Vrací celé číslo typu pid_t .





Po úspěchu vrátí fork () PID podřízeného procesu, který je větší než 0. Uvnitř podřízeného procesu je návratová hodnota 0. Pokud fork () selže, pak vrátí -1.

Jednoduchá vidlice () Příklad:

Jednoduchý příklad fork () je uveden níže:



#zahrnout
#zahrnout
#zahrnout
#zahrnout
#zahrnout

inthlavní(prázdné) {
pid_t pid=Vidlička();

-li(pid== 0) {
printf ('Child => PPID: %d PID: %d n',getppid(),dostat se());
výstup (EXIT_SUCCESS);
}
jiný -li(pid> 0) {
printf ('Rodič => PID: %d n',dostat se());
printf ('Čekání na dokončení podřízeného procesu.' n');
Počkejte(NULA);
printf ('Dětský proces skončil.' n');
}
jiný {
printf ('Nelze vytvořit podřízený proces.' n');
}

vrátit seEXIT_SUCCESS;
}

Zde jsem použil fork () k vytvoření podřízeného procesu z hlavního/nadřazeného procesu. Poté jsem vytiskl PID (ID procesu) a PPID (ID rodičovského procesu) z podřízeného a nadřazeného procesu. Na rodičovském procesu čekání (NULL) se používá k čekání na dokončení podřízeného procesu. V podřízeném procesu se exit () používá k dokončení podřízeného procesu. Jak vidíte, PID nadřazeného procesu je PPID podřízeného procesu. Takže proces dítěte 24738 patří do rodičovského procesu 24731 .

Můžete také použít funkce, aby byl váš program více modulární. Tady jsem použil processTask () a parentTask () funkce pro podřízené a rodičovské procesy. Takto se vlastně používá fork ().

#zahrnout
#zahrnout
#zahrnout
#zahrnout
#zahrnout

prázdnéchildTask() {
printf ('Ahoj světe n');
}

prázdnéparentTask() {
printf ('Hlavní úkol. n');
}

inthlavní(prázdné) {
pid_t pid=Vidlička();

-li(pid== 0) {
childTask();
výstup (EXIT_SUCCESS);
}
jiný -li(pid> 0) {
Počkejte(NULA);
parentTask();
}
jiný {
printf ('Nelze vytvořit podřízený proces.');
}

vrátit seEXIT_SUCCESS;
}

Výstup výše uvedeného programu:

Spouštění více podřízených procesů pomocí fork () a Loop:

Pomocí smyčky můžete také vytvořit tolik podřízených procesů, kolik potřebujete. V níže uvedeném příkladu jsem vytvořil 5 podřízených procesů pomocí cyklu for. Vytiskl jsem také PID a PPID z podřízených procesů.

#zahrnout
#zahrnout
#zahrnout
#zahrnout
#zahrnout

inthlavní(prázdné) {
pro(int= 1;<= 5;++) {
pid_t pid=Vidlička();

-li(pid== 0) {
printf ('Podřízený proces => PPID =%d, PID =%d n',getppid(),dostat se());
výstup (0);
}
jiný {
printf ('Nadřazený proces => PID =%d n',dostat se());
printf („Čekání na dokončení podřízených procesů ... n');
Počkejte(NULA);
printf (“dětský proces skončil. n');
}
}

vrátit seEXIT_SUCCESS;
}

Jak vidíte, ID nadřazeného procesu je stejné ve všech podřízených procesech. Všichni tedy patří stejnému rodiči. Vykonávají také lineárně. Jeden po druhém. Řízení podřízených procesů je důmyslný úkol. Pokud se dozvíte více o programování systému Linux a o tom, jak funguje, budete moci tok těchto procesů řídit, jakkoli budete chtít.

Příklad ze skutečného života:

Různé složité matematické výpočty, jako je md5, sha256 atd., Generování hash vyžaduje hodně výpočetního výkonu. Namísto výpočtu takových věcí ve stejném procesu jako hlavní program můžete pouze vypočítat hash v podřízeném procesu a vrátit hash do hlavního procesu.

V následujícím příkladu jsem vygeneroval 4místný PIN kód v podřízeném procesu a odeslal jej do nadřazeného procesu, hlavního programu. Poté jsem odtud vytiskl PIN kód.

#zahrnout
#zahrnout
#zahrnout
#zahrnout
#zahrnout

intgetPIN() {
// jako osivo použijte PPID a PID
srand (dostat se() +getppid());
inttajný= 1000 + řádek () % 9000;
vrátit setajný;
}

inthlavní(prázdné) {
intfd[2];
trubka(fd);
pid_t pid=Vidlička();

-li(pid> 0) {
zavřít(0);
zavřít(fd[1]);
po(fd[0]);

inttajné číslo;
velikost_tčístBytes=číst(fd[0], &tajné číslo, velikost(tajné číslo));

printf ('Čekání na PIN ... n');
Počkejte(NULA);
printf ('Přečteno bajtů: %ld n',čístBytes);
printf ('PIN: %d n',tajné číslo);
}
jiný -li(pid== 0) {
zavřít(1);
zavřít(fd[0]);
po(fd[1]);

inttajný=getPIN();
napsat(fd[1], &tajný, velikost(tajný));
výstup (EXIT_SUCCESS);
}

vrátit seEXIT_SUCCESS;
}

Jak vidíte, při každém spuštění programu dostanu jiný 4místný PIN kód.

V zásadě tedy v systému Linux používáte systémové volání fork (). Děkujeme za přečtení tohoto článku.