Dlaczego warto używać posix spawn?
posix_spawn () I posix_spawnp () Oba funkcje są używane do tworzenia nowego procesu dziecka. Proces dziecka następnie wykonuje plik. Funkcje te zostały określone przez POSIX w celu standaryzacji metody tworzenia nowych procesów dla maszyn, które nie mają obsługi wywołania systemu widelca. Maszyny te są zwykle małe i brakuje wbudowanych systemów do obsługi LMMU.
Dwie funkcje łączą widelec i exec, z dodatkowymi krokami, które wykonają dziecko. Działają jako podzbiór funkcjonalności, zwykle osiągany za pomocą widelca, dla wszystkich wywołań systemowych i wbudowanych systemów, które nie mają takiej funkcjonalności.
Przykład 1: POSIX_spawn ()
W tym przykładzie użyjemy funkcji Spawn () do tworzenia i wykonania nowego procesu dziecka. Następnie wyjaśnimy wszystkie odpowiednie argumenty użyte w funkcji.
Argumenty użyte w przykładzie są następujące:
Argument | Opis |
---|---|
Służy do zdefiniowania wszystkich operacji odrodzenia. | |
ścieżka | Nazwa ścieżki, która ma zostać wykonana. |
fd_count | Liczba wpisów z tablicą fd_map. Jeśli fd_count jest równa 0, wówczas fd_map jest ignorowany. W takich przypadkach proces dziecięcy dziedziczy wszystkie deskryptory plików, ignorując te zmodyfikowane. |
FD_MAP | Szereg deskryptorów plików, które mają zostać odziedziczone przez proces dziecka. Tutaj, jeśli wartość FD_Count nie wynosi 0, potrzebna jest FD_MAP, aby doprowadzić deskryptory plików FD_Count do najwyższej wartości Open_Max. To ma: · Wkład procesu dziecka · Wyjście · Wartości błędów |
dziedziczyć | Dziedziczenie struktury pokazuje, że użytkownicy chcą, aby proces ich dziecka odziedziczył wszystko od rodzica. |
Argv | Wskaźnik do konkretnego wektora argumentu. Wartość Argv [0] nie może być zerowa i musi być załadowaną nazwą pliku. Wartość Argv nie może być równa NULL. |
Envp | Wskazuje na szereg wskazówek postaci. Każdy z wskaźników w tej tablicy wskazuje na zmienną środowiskową. Punkt końcowy tablicy to wskaźnik zerowy. |
Przykład 2: Test.C
W poniższym przykładzie powstaje nowy proces dzieci, aby uruchomić polecenie /bin/sh -c. Jest to wartość przekazana jako pierwszy argument. test.C Kod jest następujący:
W powyższym przykładzie nazywaliśmy biblioteki, a następnie nazwaliśmy ikra.H nagłówek. Zobaczysz także posix_spawn () wywołane w celu utworzenia procesu dziecka w powyższym przykładzie. ikra I Spawnp funkcje są używane zamiast widelec I Exec Funkcje. Ikra() ma elastyczność i zapewnia użytkownikom wiele łatwości. Jest to trochę odmienne od system() I exec (). Wróci i stworzy proces świeżego dzieci. W naszym przykładzie jest to pid. Powyżej widać, że funkcja oczekiwania WaitPid (), Następnie system() Jest używane. Zauważ, że ikra() I widelec() Procesy wywołujące są takie same, a metoda implementacji jest mniej więcej taka sama dla obu funkcji.
Teraz wykonamy przykład za pomocą GCC kompilator. Możesz także użyć dowolnego innego wybranego kompilatora:
Test $ sudo gcc.c -Lrt
Następnie uruchom następujące:
$ ./A.na zewnątrz
Wyjście powyższego polecenia będzie wyglądać w następujący sposób:
Dziecko pid zostanie utworzony, jak widać na powyższym wyjściu.
Biblioteka
Libc: Użyj -l c, aby połączyć GCC kompilator. Zauważ tutaj, że ta biblioteka jest zawarta automatycznie.
Ikra()
ikra() Funkcja oparta jest na POSIX 1003.1D PROJEKT standardowy zastosowany jako posix_spawn (). Biblioteka C zawiera funkcje Spawn*(). Tutaj wymienimy kilka sufiksów wraz z ich opisami:
mi: używane jako tablica zmiennych środowiskowych.
L: używane jako zerowa lista argumentów używanych w programie.
P: używane do zdefiniowania względnej ścieżki. Jeśli ścieżka nie ma wartości w swojej wartości, system używa i przeszukuje zmienną środowiskową ścieżki dla dowolnego podobnego programu.
V: działa jako wektor argumentów w programie.
Mapowanie deskryptorów plików
W ikra(), Ćwiczymy fd_count I FD_MAP Argumenty, aby wywołać deskryptory plików. Określa, które dziecko dziedziczyć.
Liczba używana jako deskryptor pliku dla procesu dziecięcego zależy od jego lokalizacji wewnątrz FD_MAP. Tutaj rozważymy przykład rodzica z deskryptorami plików o wartości 1, 3 i 5, wówczas mapowanie będzie takie:
>> int fd_map = 1, 3, 5;
Dla dziecka | Dla rodzica |
---|---|
0 | 1 |
1 | 3 |
2 | 5 |
Zauważ, że jeśli używasz jawnego FD_MAP Aby dopasować te deskryptory plików do dziecka i rodzica, musisz zmapować Spwan_fdclose funkcja do kontynuacji.
Flagi spadkowe
W odrodzeniu użytkownicy muszą wywołać dowolną z poniższych flag w przypadku dziedzictwa. Niektóre przykłady flag odradzania i ich opisów podano poniżej:
Flaga | Opis |
---|---|
Spawn_align_default | Ta flaga służy do skonfigurowania domyślnych ustawień konfiguracji do wyrównania. |
Spawn_align_fault | Ta flaga jest używana do niewspółosiowości błędów w odniesieniach do danych. |
Spawn_align_nofault | Ta flaga służy do naprawy niewspółosiowości usterki. |
Spawn_debug | Ta flaga służy do debugowania jądra. |
Spawn_exec | Spawn działa jak Exec*() za pomocą tej flagi. |
Spawn_explit_cpu | Ta flaga służy do ustawiania maski uruchomienia i odziedziczenia maski = członek Maski Run Mask. |
Spawn_explit_sched | Ta flaga służy do ustalenia zasady planowania. |
<ikra.H> definiuje tę maskę Spawn_Align_Mask Służy do wyrównania flag wymienionych powyżej.
PID_T PGROUP | Grupa procesów dla dzieci, jeśli określisz sPawn_SetGroup w członku flagi. |
int Runmask | Mash Process Process w celu odziedziczenia masek uzgodnionych na podstawie wartości tego członka. |
sigset_t sigMask | Maska sygnałowa dla procesu potomnego, który jest używany do określenia statusu elementów flagi. |
sigset_t sigdefault | Zestaw procesów dziecięcych domyślnych sygnałów. |
Błędy
posix_spawn () I posix_spawnp () Funkcje mogą również zawodzić w niektórych przypadkach, takie jak następujące:
Einval: Tak jest, gdy wartość zidentyfikowana przez FILE_ACTIONS Lub attrp jest nieprawidłowe i odpowiednie.
Gdy widelec bazowy (2), widelec (2) lub klon (2) połączenie się nie powiedzie, ikra() Funkcje zwrócą numer błędu.
Enosys: Tak jest, jeśli funkcja i jej wsparcie nie są uwzględnione ani dostarczane w systemie.
Wniosek
Ten samouczek obejmował podstawowe funkcje dostarczone przez Posix_spawn () oraz funkcje używane przez IT do wykonywania i wykonywania jego funkcji. Omówiliśmy również flagi i błędy powszechnie używane przez spawn.