Obrázek 1: Pracovní postup Basic fork ()
V tomto článku vám ukážu, jak pomocí systémového volání fork () vytvořit podřízené procesy v jazyce C. Pojďme tedy začít.
fork () Syntaxe a návratová hodnota:
Syntaxe funkce systému fork () je následující:
pid_t fork (void);Funkce systému fork () nepřijímá žádný argument. Vrátí celé číslo typu pid_t.
Při ú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, vrátí -1.
Jednoduchá vidlice () Příklad:
Níže je uveden jednoduchý příklad fork ():
#zahrnout#zahrnout
#zahrnout
#zahrnout
#zahrnout
int main (void)
pid_t pid = vidlice ();
if (pid == 0)
printf ("Dítě => PPID:% d PID:% d \ n", getppid (), getpid ());
exit (EXIT_SUCCESS);
else if (pid> 0)
printf ("Rodič => PID:% d \ n", getpid ());
printf ("Čekání na dokončení podřízeného procesu.\ n ");
počkat (NULL);
printf ("Podřízený proces dokončen.\ n ");
else
printf ("Nelze vytvořit podřízený proces.\ n ");
vrátit EXIT_SUCCESS;
Tady jsem použil fork () k vytvoření podřízeného procesu z hlavního / nadřazeného procesu. Poté jsem z podřízeného a nadřazeného procesu vytiskl PID (ID procesu) a PPID (ID nadřazeného procesu). Na nadřazeném procesu se čekání (NULL) používá k čekání na dokončení podřízeného procesu. V podřízeném procesu se k dokončení podřízeného procesu používá exit (). Jak vidíte, PID nadřazeného procesu je PPID podřízeného procesu. Proces dítěte 24738 patří do nadřazeného procesu 24731.
Můžete také použít funkce, aby byl váš program modulárnější. Tady jsem použil processTask () a parentTask () funkce pro podřízené a rodičovské procesy. Takto se ve skutečnosti používá fork ().
#zahrnout#zahrnout
#zahrnout
#zahrnout
#zahrnout
void childTask ()
printf ("Hello World \ n");
void parentTask ()
printf ("Hlavní úkol.\ n ");
int main (void)
pid_t pid = vidlice ();
if (pid == 0)
childTask ();
exit (EXIT_SUCCESS);
else if (pid> 0)
počkat (NULL);
parentTask ();
else
printf ("Nelze vytvořit podřízený proces.");
vrátit EXIT_SUCCESS;
Výstup výše uvedeného programu:
Spuštění více podřízených procesů pomocí fork () a Loop:
Smyčku můžete také použít k vytvoření tolik podřízených procesů, kolik potřebujete. V níže uvedeném příkladu jsem vytvořil 5 podřízených procesů pomocí smyčky for. Také jsem vytiskl PID a PPID z podřízených procesů.
#zahrnout#zahrnout
#zahrnout
#zahrnout
#zahrnout
int main (void)
pro (int i = 1; i <= 5; i++)
pid_t pid = vidlice ();
if (pid == 0)
printf ("Podřízený proces => PPID =% d, PID =% d \ n", getppid (), getpid ());
exit (0);
else
printf ("Nadřazený proces => PID =% d \ n", getpid ());
printf ("Čekání na dokončení podřízených procesů ... \ n");
počkat (NULL);
printf ("podřízený proces dokončen.\ n ");
vrátit EXIT_SUCCESS;
Jak vidíte, ID nadřazeného procesu je ve všech podřízených procesech stejné. Všechny tedy patří stejnému rodiči. Provádějí také lineárně. Jeden po druhém. Řízení podřízených procesů je sofistikovaný úkol. Pokud se dozvíte více o programování systému Linux a o tom, jak to funguje, budete moci řídit tok těchto procesů, jakkoli budete chtít.
Příklad ze skutečného života:
Různé složité matematické výpočty, jako je generování hash md5, sha256 atd., Vyžadují hodně výpočetního výkonu. Místo toho, abyste podobné věci počítali ve stejném procesu jako hlavní program, můžete jen vypočítat hash u podřízeného procesu a vrátit hash do hlavního procesu.
V následujícím příkladu jsem v podřízeném procesu vygeneroval čtyřmístný PIN kód a odeslal ho nadřazenému procesu, hlavnímu programu. Poté jsem odtud vytiskl PIN kód.
#zahrnout#zahrnout
#zahrnout
#zahrnout
#zahrnout
int getPIN ()
// použijte PPID a PID jako osivo
srand (getpid () + getppid ());
int secret = 1000 + rand ()% 9000;
návratové tajemství;
int main (void)
int fd [2];
trubka (fd);
pid_t pid = vidlice ();
if (pid> 0)
zavřít (0);
zavřít (fd [1]);
dup (fd [0]);
int secretNumber;
size_t readBytes = read (fd [0], & secretNumber, sizeof (secretNumber));
printf ("Čekání na PIN ... \ n");
počkat (NULL);
printf ("Číst bajty:% ld \ n", readBytes);
printf ("PIN:% d \ n", secretNumber);
else if (pid == 0)
zavřít (1);
zavřít (fd [0]);
dup (fd [1]);
int secret = getPIN ();
write (fd [1], & secret, sizeof (secret));
exit (EXIT_SUCCESS);
vrátit EXIT_SUCCESS;
Jak vidíte, pokaždé, když spustím program, dostanu jiný 4místný PIN kód.
V zásadě tedy používáte systémové volání fork () v Linuxu. Děkujeme za přečtení tohoto článku.