System widelca wywołuje Linux

System widelca wywołuje Linux
Wywołanie systemu widelców służy do tworzenia nowych procesów. Nowo utworzony proces to proces dzieci. Proces, który wywołuje widelec i tworzy nowy proces, jest procesem nadrzędnym. Procesy dziecka i nadrzędne są wykonywane jednocześnie.

Ale procesy dziecka i rodzica znajdują się w różnych przestrzeniach pamięci. Te przestrzenie pamięci mają tę samą zawartość, a wszelka operacja jest wykonywana w jednym procesie, nie wpłynie na inny proces.

Po utworzeniu procesu dziecka; Teraz oba procesy będą miały ten sam licznik programu (PC), więc oba te procesy wskazują na tę samą instrukcję. Pliki otwarte przez proces nadrzędny będą takie same w przypadku procesu potomnego.

Proces dziecka jest dokładnie taki sam jak jego rodzic, ale istnieje różnica w procesach ID:

  1. Identyfikator procesu procesu potomnego jest unikalnym identyfikatorem procesu, który różni się od identyfikatorów wszystkich innych istniejących procesów.
  2. Identyfikator procesu nadrzędnego będzie taki sam jak identyfikator procesu rodzica dziecka.

Właściwości procesu dziecięcego

Oto niektóre z właściwości, które utrzymuje proces dziecka:

  1. Liczniki procesora i użycie zasobów są inicjowane w celu resetowania do zera.
  2. Po zakończeniu procesu nadrzędnego procesy dziecięce nie odbierają żadnego sygnału, ponieważ atrybut PR_SET_PDEATHSIG w PRCTL () jest resetowany.
  3. Wątek używany do wywoływania Fork () tworzy proces dziecięcy. Tak więc adres procesu dziecka będzie taki sam jak adres rodzica.
  4. Deskryptor pliku procesu nadrzędnego jest dziedziczony przez proces dziecka. Na przykład przesunięcie pliku lub statusu flag i atrybutów we/wy zostanie udostępnione między deskryptorami plików procesów dziecięcych i nadrzędnych. Zatem deskryptor pliku klasy nadrzędnej będzie odwoływać się do tego samego deskryptora pliku klasy dzieci.
  5. Deskryptory kolejki otwartej wiadomości w procesie nadrzędnym są dziedziczone przez proces dziecka. Na przykład, jeśli deskryptor pliku zawiera komunikat w procesie nadrzędnym, ta sama wiadomość będzie obecna w odpowiednim deskryptorze pliku procesu dziecięcego. Możemy więc powiedzieć, że wartości flagi tych deskryptorów plików są takie same.
  6. Podobnie otwarte strumienie katalogów będą odziedziczone przez procesy dziecięce.
  7. Domyślna wartość luzu licznika klasy dzieci jest taka sama jak bieżąca wartość luźna timera klasy nadrzędnej.

Właściwości, które nie są dziedziczone przez proces dziecięcy

Oto niektóre z właściwości, które nie są dziedziczone przez proces dziecka:

  1. Zamki pamięci
  2. Oczekujący sygnał klasy dziecka jest pusty.
  3. Process powiązane z blokami rekordów (fcntl ())
  4. Asynchroniczne operacje we/wy i zawartość we/wy.
  5. Powiadomienia o zmianie katalogu.
  6. Timery, takie jak alarm (), setitimer () nie są dziedziczone przez klasę dzieci.

Fork () w c

W Fork () nie ma żadnych argumentów, a typ powracania widelca () to liczba całkowita. Musisz dołączyć następujące pliki nagłówka, gdy używany jest Fork ():

#włączać
#włączać
#włączać

Podczas pracy z Fork () można użyć do typu PID_T dla procesów identyfikator jako PID_T jest zdefiniowany w .

Plik nagłówka jest miejscem, w którym definiuje się Fork (), więc musisz go dołączyć do swojego programu, aby użyć Fork ().

Typ powrotu jest zdefiniowany w wywołaniu i widelec () jest zdefiniowany w . Dlatego musisz dołączyć oba w swoim programie, aby użyć połączenia systemowego Fork ().

Składnia widelca ()

Składnia wywołania systemu Fork () w Linux, Ubuntu jest następujący:

PID_T Fork (void);

W składni typ powrotu jest PID_T. Po pomyślnym utworzeniu procesu dziecka PID procesu dziecięcego jest zwracany w procesie nadrzędnym, a 0 zostanie zwrócony do samego procesu dziecka.

Jeśli wystąpi jakikolwiek błąd, -1 jest zwracany do procesu nadrzędnego, a proces dziecięcy nie jest tworzony.

Nie są przekazywane żadne argumenty na Fork ().

Przykład 1: Wezwanie Fork ()

Rozważ poniższy przykład, w którym użyliśmy wywołania systemu Fork (), aby utworzyć nowy proces dzieci:

#włączać
#włączać
#włączać
int main ()

widelec();
printf („Używając fork () System Call \ n”);
powrót 0;

WYJŚCIE:

Sysads@Linuxhint $ GCC Fork.C -O Fork
sysads@Linuxhint $ ./widelec
Za pomocą wywołania systemu Fork ()
Za pomocą wywołania systemu Fork ()

W tym programie użyliśmy Fork (), stworzy to nowy proces dzieci. Po utworzeniu procesu dziecka zarówno proces nadrzędny, jak i proces dziecka wskazują na następną instrukcję (ten sam licznik programu). W ten sposób pozostałe instrukcje lub instrukcje C zostaną wykonane przez całkowitą liczbę czasów procesu, czyli 2N razy, gdzie n jest liczbą wywołań systemu widelec ().

Więc gdy wywołanie widelec () jest używane jeden raz jak wyżej (21 = 2) Będziemy mieli wyjście 2 razy.

Tutaj, gdy użyto wywołania systemu Fork (), wewnętrzna struktura będzie wyglądać jak:

Rozważ następujący przypadek, w którym widelca () jest używany 4 razy:

#włączać
#włączać
#włączać
int main ()

widelec();
widelec();
widelec();
widelec();
printf („Używając fork () System Call \ n”);
powrót 0;

Wyjście:

Sysads@Linuxhint $ GCC Fork.C -O Fork
sysads@Linuxhint $ ./widelec
Za pomocą wywołania systemu Fork ()
Za pomocą wywołania systemu Fork ()
Za pomocą wywołania systemu Fork ()
Za pomocą wywołania systemu Fork ()
Za pomocą wywołania systemu Fork ()
Za pomocą wywołania systemu Fork ()
Za pomocą wywołania systemu Fork ()
Za pomocą wywołania systemu Fork ()
Za pomocą wywołania systemu Fork ()
Za pomocą wywołania systemu Fork ()
Za pomocą wywołania systemu Fork ()
Za pomocą wywołania systemu Fork ()
Za pomocą wywołania systemu Fork ()
Za pomocą wywołania systemu Fork ()
Za pomocą wywołania systemu Fork ()
Za pomocą wywołania systemu Fork ()
sysads@Linuxhint $

Teraz całkowita liczba utworzonych procesów to 24 = 16 i mamy naszą instrukcję drukowania 16 razy.

Przykład 2: Testowanie, jeśli Fork () zakończył się powodzeniem

W poniższym przykładzie wykorzystaliśmy konstrukcję decyzyjną do przetestowania wartości (int) zwróconej przez Fork (). I wyświetlane są odpowiednie komunikaty:

#włączać
#włączać
#włączać
int main ()

PID_T P;
p = rozwidlenie ();
if (p ==-1)

printf („Występuje błąd, gdy wywołuje Fork () \ n”);

if (p == 0)

printf („Jesteśmy w procesie dziecka \ n”);

w przeciwnym razie

printf („Jesteśmy w procesie nadrzędnym \ n”);

powrót 0;

WYJŚCIE:

Sysads@Linuxhint $ GCC Fork.C -O Fork
sysads@Linuxhint $ ./widelec
Jesteśmy w procesie nadrzędnym
Jesteśmy w procesie dziecka

W powyższym przykładzie użyliśmy typu PID_T, który będzie przechowywać wartość zwracaną Fork (). Fork () jest nazywany online:

p = rozwidlenie ();

Tak więc wartość liczb całkowita zwrócona przez Fork () jest przechowywana w P, a następnie P jest porównywana w celu sprawdzenia, czy nasze połączenie Fork () zakończyło się powodzeniem.

Gdy połączenie Fork () jest z powodzeniem tworzone, proces identyfikator dzieci zostanie zwrócony do procesu nadrzędnego, a 0 zostanie zwrócony do procesu dziecka.Identyfikator procesu dziecka w procesie nadrzędnym nie będzie taki sam, jak identyfikator procesu dziecka w samym procesie dziecka. W procesie dziecka identyfikator procesu dziecka wyniesie 0.

W tym samouczku możesz zobaczyć, jak zacząć od połączenia systemu widelca w Linux.