Funkcja execv w języku c

Funkcja execv w języku c

Istnieje kilka sposobów i funkcji, aby rozpocząć procesy z programu. Każdy z nich oferuje różne rozwiązania programistowi w zależności od potrzeb konkretnej sprawy.

execxx () Rodzina to zestaw funkcji systemowych, które są zdefiniowane w „unistd.H ”nagłówek, aby uruchomić proces z programu. Ta rodzina funkcji pozwala nam wysłać argumenty wejściowe do wykonywalnego, który je wywołuje, dlatego jest to bardzo przydatne źródło interakcji między procesami.

W tym Wskazówka Linux Artykuł, dowiesz się wszystkiego o execv () Funkcja w języku C. Przyjrzymy się jej składni, teoretycznym opisie tego, jak to działa, argumenty wejściowe i wyjściowe oraz rodzaj danych, które każdy z nich przetwarza. Dowiesz się także, jak tworzyć i korzystać z tablicy strun i wskaźników, które są częścią argumentów wejściowych tej rodziny funkcji i są przekazywane do procesu wywołania.

Następnie stosujemy to, czego nauczyliśmy się w praktycznym przykładzie, który pokazuje prawidłowe wdrożenie i wywołanie execv () funkcjonować.

Składnia funkcji execV () w języku c

int execv (const char *ścieżka, char *const argv []);

Opis funkcji execV () w języku c

execv () Funkcja wykonuje proces z innego procesu lub programu. Ta funkcja wykonuje plik lub wykonywalny, który jest określony w *ścieżka argument. Ten wpis powinien zawierać bezwzględną lub względną ścieżkę pliku wykonywalnego w formacie ciągów.

*argv [] Argument jest szeregiem wskazówek do ciągów, w których każdy ciąg jest argumentem wejściowym, który jest przekazywany do procesu, który ma zostać wykonany. Pierwszy wskaźnik tablicy powinien zawsze wskazywać na ciąg, który zawiera nazwę pliku wykonywalnego, a ostatni wskaźnik powinien zawsze być zerowy. Gdy execv () nazywany jest, proces, z którego go nazywano, został zakończony, przepisany i zastępowany nowym procesem w przydzielonej części pamięci i z tym samym identyfikatorem.

Jeśli funkcja jest przeprowadzana pomyślnie, nie wraca. Jeśli zwróci, dzieje się tak, ponieważ występuje błąd. Błędy, które może wygenerować ta funkcja, są zróżnicowane, od nieistniejącej ścieżki pliku wykonywalnego do odmowy uprawnień.

Błąd można zidentyfikować, pobierając jego wartość z errno Zmienna globalna. W późniejszej części zobaczymy specjalną sekcję, która wyjaśnia najczęstsze błędy tej funkcji i ich identyfikację.

Rodzina execxx () Funkcje są zdefiniowane w „unistd.H ”nagłówek. Aby ich użyć, musimy je uwzględnić w „.plik C ”w następujący sposób:

#włączać

Jak wykonać proces z programu za pomocą funkcji execV () w języku c

W tym przykładzie wyjaśnimy, jak korzystać z execv () funkcja wykonania procesu i przekazania argumentów wejściowych z jednego programu do drugiego.

Aby to zrobić, tworzymy dwa bardzo proste kody. Jednym z nich jest proces nadrzędny, który wywołuje funkcję execV () do wykonywania procesu dziecka. Kiedy execv () Funkcja rozpoczyna proces potomny, przekazuje go z trzema argumentami wejściowymi w postaci ciągu, który proces dziecięcy pobiera i wyświetla na powładzie.

Proces dziecka

Proces dziecięcy jest prostym kodem, który drukuje „Jestem procesem dzieci ” Wiadomość, pobiera argumenty wejściowe wysyłane przez proces nadrzędny i wyświetla je na powładzie. Oto kod procesu dziecka:

#włączać
#włączać
#włączać
int main (int argc, char *argv [])

printf („Jestem procesem dziecięcym”);
printf („Argument 1: %s \ n”, argv [1]);
printf („Argument 2: %s \ n”, argv [2]);
printf („Argument 3: %s \ n”, argv [3]);


Kompilujemy ten kod i oszczędzamy jego produkcję w „Dokumentach” pod nazwą „dziecięcą” z „.rozszerzenie BIN ”, jak pokazano następująco:

~ $ GCC dokumenty/dziecko.C -O dokumenty/dziecko.kosz


W ten sposób zapisujemy plik wykonywalny dla dzieci w „Dokumentach”. Ścieżka tego wykonywacza jest argumentem wejściowym, ścieżka, Podczas dzwonienia execv () W procesie nadrzędnym.


Proces rodzica

Proces nadrzędny jest tym, z którego nazywamy execv () funkcja do wykonania procesu dziecka. W tym kodzie definiujemy szereg wskazówek do ciągów reprezentujących argumenty wejściowe do procesu execv () Funkcja otwiera się.

Możesz zobaczyć, jak prawidłowo utworzyć szereg wskaźników na struny na następującej ilustracji. W tym przypadku składa się z 5 wskaźników i nazywa się arg_ptr [].

char *arg_ptr [5];


Po zdefiniowaniu szeregu wskaźników, każdemu wskaźnikowi należy przypisać ciąg, który zawiera argument wejściowy, który wysyłamy do procesu dziecka.

Możesz zobaczyć, jak przypisać każdy wskaźnik odpowiednim argumentem w formacie ciągów w następującej ilustracji:

arg_ptr [0] = "dziecko.C";
arg_ptr [1] = "\ nhello z";
arg_ptr [2] = "proces 2";
arg_ptr [3] = null;


Innym sposobem przypisania sznurków do tablicy wskaźnika jest zamknięcie strun w kręconych aparatach ortodontycznych i oddzielenie ich przecinkami:

arg_ptr [] = "dziecko.c, „\ nhello z”, „proces 2”, null;


Po zdefiniowaniu szeregu wskazówek do każdego argumentu, następnym krokiem jest wywołanie execv () funkcja, przekazanie ciągu, który zawiera bezwzględną lub względną ścieżkę pliku wykonywalnego jako pierwszy argument i tablica ciągów arg_ptr []Jako drugi argument.

Możesz zobaczyć pełny „główny” procesu nadrzędnego na następującej ilustracji:

#włączać
#włączać
#włączać
#włączać
#włączać
int main ()
printf ("\ n \ ni am Process Process \ n");
char *arg_ptr [5];
arg_ptr [0] = "dziecko.C";
arg_ptr [1] = "\ nhello z";
arg_ptr [2] = "proces 2";
arg_ptr [3] = null;
execv ("/home/linuxhint/dziecko.bin ”, arg_ptr);


Opracowujemy ten kod, który określa ścieżkę „.plik C ”i nazwa Out.

~ $ GCC Dokumenty/rodzic.Wzór c -o


Następnie uruchamiamy wyjście.

~ $ ./ wzór


Proces nadrzędny wyświetla „Jestem procesem nadrzędnym” komunikat, tworzy tablicę ciągu, przypisując ciąg dla każdego argumentu wejściowego, który jest przekazywany do następnego procesu, i wywołuje execv () funkcjonować. Jeśli execv () funkcja wykonuje się z powodzeniem, dziecko.Bin wykonywalny zastępuje proces nadrzędny i przejmuje jego identyfikator i przydzieloną pamięć, więc to akcja nie może być cofnięta.

Proces dziecka wyświetla „Jestem procesem dziecka” Wiadomość i pobiera każdy z argumentów wejściowych, które są przekazywane przez proces nadrzędny do wyświetlenia na konsoli poleceń.

Jak rozpoznać możliwe błędy podczas korzystania z funkcji execv ()

execv () Funkcja nie zwraca, jeśli zostanie wykonana pomyślnie. Jeśli powróci do kodu, który go nazywał, wystąpił błąd. Błędy, które mogą być wygenerowane przez tę funkcję, są różnorodne, ponieważ operacja zależy od dwóch różnych procesów, ścieżek plików, uprawnień do dostępu i tak dalej.

Sposób identyfikacji błędu jest za pośrednictwem errno Zmienna globalna. Ta zmienna jest liczbą całkowitą i jest zdefiniowana w „Errno.H ”nagłówek. Za każdym razem, gdy występuje błąd, przechowywana jest wartość liczbowa, która reprezentuje określony błąd.

Następnie patrzymy na definicje i reprezentatywną wartość możliwych błędów, które mogą wystąpić podczas korzystania z tej funkcji:


Generujemy błąd na ojcostwie.kod C, wskazujący nieistniejącą ścieżkę pliku do execv () funkcjonować. Następnie użyj funkcji printF, aby wyświetlić kod błędu uzyskany z errno Zmienna w konsoli:

#włączać
#włączać
#włączać
#włączać
#włączać
int main ()
printf ("\ n \ ni am Process Process \ n");
char *arg_ptr [5];
arg_ptr [0] = "dziecko.C";
arg_ptr [1] = "\ nhello z";
arg_ptr [2] = "proces 2";
arg_ptr [3] = null;
execv ("/home/linuxhint/non egzystencja.bin ”, arg_ptr);
printf („błąd: %i \ n”, errno);


Jak widać na poniższym rysunku, funkcja execV () nie mogła znaleźć pliku z określoną ścieżką, a zatem powraca do procesu nadrzędnego z wartością 2 w zmiennej Errno, która odpowiada „”Brak takiego pliku lub katalogu ” błąd.

Wniosek

W tym Wskazówka Linux Artykuł, wyjaśniliśmy, jak korzystać z execv () funkcja w języku C, aby rozpocząć proces z innego procesu. Wyjaśniliśmy teoretyczne działanie execv () i pokazał, jak zadeklarować argumenty wejściowe.

Następnie wdrożyliśmy to, czego nauczyliśmy się w przykładzie, pokazując, jak utworzyć program nadrzędny i proces dziecięcy, przekazując argumenty z jednego do drugiego. Również widzieliśmy specjalną sekcję, w której pokazujemy najczęstsze błędy tej funkcji i jak je zidentyfikować za pomocą zmiennej Errno.

Mamy nadzieję, że ten artykuł jest dla Ciebie przydatny. Aby uzyskać więcej artykułów na temat porad C Language i Linux, użyj wyszukiwarki na naszej stronie internetowej.