Wywołanie systemu widelców w c

Wywołanie systemu widelców w c
Fork () System Call jest używany do tworzenia procesów dziecięcych w programie C. Fork () jest używany tam, gdzie w aplikacji wymagane jest przetwarzanie równoległe. Funkcja systemu Fork () jest zdefiniowana w nagłówkach SYS/typy.H I unistd.H. W programie, w którym korzystasz z widelca, musisz również użyć wywołania systemu Wait (). Wait () System Call jest używany do oczekiwania w procesie nadrzędnym na zakończenie procesu dziecka. Aby zakończyć proces dziecięcy, w procesie dziecięcym wykorzystywane jest połączenie systemowe exit (). Funkcja Wait () jest zdefiniowana w nagłówku SYS/WAZIEŃ.H a funkcja exit () jest zdefiniowana w nagłówku stdlib.H.

Ryc. 1: Basic Fork () Workflow

W tym artykule pokażę Ci, jak użyć systemu Fork (), aby stworzyć procesy dziecięce w C. Więc zacznijmy.

Fork () Składnia i wartość zwracana:

Składnia funkcji systemu Fork () jest następująca:

PID_T Fork (void);

Funkcja systemu Fork () nie akceptuje żadnego argumentu. Zwraca liczbę całkowitą typu PID_T.

W przypadku sukcesu Fork () zwraca PID procesu dziecięcego, który jest większy niż 0. W procesie dziecka wartość zwracania wynosi 0. Jeśli Fork () nie powiedzie się, wówczas zwraca -1.

Prosty Fork () Przykład:

Poniżej podano prosty przykład widelec ():

#włączać
#włączać
#włączać
#włączać
#włączać
int main (void)
PID_T PID = Fork ();
if (pid == 0)
printf ("child => pPID: %d PID: %d \ n", getPpid (), getPid ());
exit (exit_success);

else if (PID> 0)
printf ("parent => pid: %d \ n", getpid ());
printf („Oczekiwanie na zakończenie procesu dziecka.\N");
Czekaj (NULL);
printf („Proces dziecka zakończony.\N");

w przeciwnym razie
printf („Nie można stworzyć procesu dziecięcego.\N");

return exit_success;

Tutaj użyłem Fork () do utworzenia procesu potomnego z procesu głównego/nadrzędnego. Następnie wydrukowałem PID (identyfikator procesu) i PPID (identyfikator procesu nadrzędnego) z procesu dziecięcego i nadrzędnego. W procesie nadrzędnym oczekiwanie (NULL) jest używane do zakończenia procesu dziecka. W procesie dziecka Exit () jest używany do zakończenia procesu dziecka. Jak widać, PID procesu nadrzędnego jest PPID procesu dziecięcego. Tak więc proces dziecięcy 24738 należy do procesu nadrzędnego 24731.

Możesz także użyć funkcji, aby Twój program był bardziej modułowy. Tutaj użyłem ProcessTask () I marenittask () funkcje odpowiednio dla procesów dziecka i macierzystego. W ten sposób faktycznie używany jest Fork ().

#włączać
#włączać
#włączać
#włączać
#włączać
void childTask ()
printf („Hello World \ n”);

void marenitask ()
printf („Główne zadanie.\N");

int main (void)
PID_T PID = Fork ();
if (pid == 0)
childTask ();
exit (exit_success);

else if (PID> 0)
Czekaj (NULL);
rodzicTask ();

w przeciwnym razie
printf („Nie można stworzyć procesu dziecięcego.");

return exit_success;

Wyjście powyższego programu:

Uruchamianie wielu procesów dla dzieci za pomocą Fork () i Loop:

Możesz także użyć pętli, aby stworzyć tyle procesów dzieci, ile potrzebujesz. W poniższym przykładzie utworzyłem 5 procesów dziecięcych za pomocą pętli. Wydrukowałem również PID i PPID z procesów dziecka.

#włączać
#włączać
#włączać
#włączać
#włączać
int main (void)
dla (int i = 1; i <= 5; i++)
PID_T PID = Fork ();
if (pid == 0)
printf ("Dziecięcy proces => ppid =%d, pid =%d \ n", getPPID (), getPid ());
wyjście (0);

w przeciwnym razie
printf ("Process Process => pid =%d \ n", getPid ());
printf („Oczekiwanie na zakończenie procesów dziecka… \ n”);
Czekaj (NULL);
printf („Proces dziecka zakończony.\N");


return exit_success;

Jak widać, identyfikator procesu nadrzędnego jest taki sam we wszystkich procesach dziecka. Więc wszystkie należą do tego samego rodzica. Wykonują również liniowy sposób. Jedna po drugiej. Kontrolowanie procesów dzieci jest wyrafinowanym zadaniem. Jeśli dowiesz się więcej o programowaniu systemu Linux i o tym, jak to działa, i tak będziesz mógł kontrolować przepływ tych procesów.

Przykład prawdziwy:

Różne złożone obliczenia matematyczne, takie jak MD5, SHA256 itp. Generowanie skrótu, wymaga dużej mocy obliczeniowej. Zamiast obliczać takie rzeczy w tym samym procesie, co program główny, możesz po prostu obliczyć skrót na procesie dziecka i zwrócić skrót do głównego procesu.

W poniższym przykładzie wygenerowałem 4-cyfrowy kod PIN w procesie dziecka i wysłałem go do procesu nadrzędnego, głównego programu. Następnie wydrukowałem stamtąd kod PIN.

#włączać
#włączać
#włączać
#włączać
#włączać
int getpin ()
// Użyj PPID i PID jako nasiona
srand (getPid () + getPPID ());
int secret = 1000 + rand () % 9000;
Powrót sekret;

int main (void)
int fd [2];
rura (FD);
PID_T PID = Fork ();
if (PID> 0)
Zamknij (0);
Zamknij (FD [1]);
dup (fd [0]);
int Secretnumber;
size_t ReadBytes = Read (fd [0] i SecretNumber, sizeof (SecretNumber));
printf („Oczekiwanie na pin… \ n”);
Czekaj (NULL);
printf („bajty czytaj: %ld \ n”, ReadBytes);
printf („pin: %d \ n”, SecretNumber);

else if (pid == 0)
Zamknij (1);
Zamknij (FD [0]);
dup (fd [1]);
int secret = getPin ();
Write (FD [1] i Secret, Sizeof (Secret));
exit (exit_success);

return exit_success;

Jak widać, za każdym razem, gdy uruchamiam program, otrzymuję inny 4-cyfrowy kod PIN.

Tak więc w zasadzie używasz wywołania systemu Fork () w Linux. Dziękujemy za przeczytanie tego artykułu.