Wywołanie systemowe Exec w C

Exec System Call C



Rodzina exec ma wiele funkcji w C. Te funkcje C są zasadniczo używane do uruchamiania polecenia systemowego w oddzielnym procesie, który jest głównym programem i wydrukiem danych wyjściowych.

W tym artykule omówię rodzinę funkcji exec i pokażę, jak używać każdej z tych funkcji rodziny exec w C. Zacznijmy więc.







Funkcje systemu C w rodzinie Exec:

Rodziny funkcji exec są zdefiniowane w nagłówku unistd.h . Musisz więc użyć tego nagłówka w programie C, w którym chcesz używać tych funkcji.



Dostępne funkcje exec wraz z ich parametrami funkcji podano poniżej:



  • int execl(const char *ścieżka, const char *arg, …, NULL);
  • int execlp(const char *plik, const char *arg, …, NULL );
  • int execv(const char *ścieżka, char *const argv[]);
  • int execvp(const char *plik, char *const argv[]);
  • int execle(const char *ścieżka, const char *arg, …, NULL, char * const envp[] );
  • int execve(const char *plik, char *const argv[], char *const envp[]);

Zobaczmy, co robi każda z tych funkcji i jak z nich korzystać.





execl() Funkcja systemowa:

W execl() funkcja systemowa pobiera ścieżkę do wykonywalnego pliku binarnego (tj. / kosz / ls ) jako pierwszy i drugi argument. Następnie argumenty (tj. -lh , /Dom ), który chcesz przekazać do pliku wykonywalnego, a następnie ZERO . Następnie funkcja systemowa execl() uruchamia polecenie i wyświetla dane wyjściowe. Jeśli wystąpi jakikolwiek błąd, execl() zwraca -1. W przeciwnym razie nic nie zwraca.

Składnia:

intexcl(stały zwęglać *ścieżka, stały zwęglać *zły,...,ZERO);

Poniżej podano przykład funkcji systemowej execl():



#włączać

intGłówny(próżnia) {
zwęglać *ścieżka_binarna= '/ kosz / ls';
zwęglać *arg1= '-lh';
zwęglać *arg2= '/Dom';

excl(ścieżka_binarna,ścieżka_binarna,arg1,arg2,ZERO);

powrót 0;
}

prowadziłem ls -lh / home polecenie za pomocą funkcji systemowej execl(). Jak widać, wyświetlany jest poprawny wynik.

execlp() Funkcja systemowa:

excl() nie używa ŚCIEŻKA Zmienna środowiskowa. Tak więc pełna ścieżka pliku wykonywalnego jest wymagana do uruchomienia go za pomocą execl(). execlp() używa zmiennej środowiskowej PATH. Tak więc, jeśli plik wykonywalny lub polecenie jest dostępne w PATH, to polecenie lub nazwa pliku wystarcza do jego uruchomienia, pełna ścieżka nie jest potrzebna.

Składnia:

intexclp(stały zwęglać *plik, stały zwęglać *zły,...,ZERO);

Możemy przepisać przykład execl() za pomocą funkcji systemowej execlp() w następujący sposób:

#włączać

intGłówny(próżnia) {
zwęglać *Nazwa programu= „L”;
zwęglać *arg1= '-lh';
zwęglać *arg2= '/Dom';

exclp(Nazwa programu,Nazwa programu,arg1,arg2,ZERO);

powrót 0;
}

Przekazałem tylko nazwę polecenia ls , a nie pełna ścieżka / kosz / ls . Jak widać, mam takie same dane wyjściowe, jak poprzednio.

execv() Funkcja systemowa:

W funkcji execl() parametry pliku wykonywalnego są przekazywane do funkcji jako różne argumenty. Dzięki execv() możesz przekazać wszystkie parametry w tablicy zakończonej znakiem NULL argv . Pierwszym elementem tablicy powinna być ścieżka pliku wykonywalnego. W przeciwnym razie funkcja execv() działa tak samo jak funkcja execl().

Składnia:

intexecv(stały zwęglać *ścieżka, zwęglać *stałyargv[]);

Możemy przepisać przykład execl() w następujący sposób:

#włączać

intGłówny(próżnia) {
zwęglać *ścieżka_binarna= '/ kosz / ls';
zwęglać *argumenty[] = {ścieżka_binarna, '-lh', '/Dom',ZERO};

execv(ścieżka_binarna,argumenty);

powrót 0;
}

Jak widać, otrzymuję prawidłowe dane wyjściowe.

execvp() Funkcja systemowa:

Działa tak samo jak funkcja systemowa execv(). Ale używana jest zmienna środowiskowa PATH. Tak więc pełna ścieżka pliku wykonywalnego nie jest wymagana, tak jak w przypadku execlp().

Składnia:

intexecvp(stały zwęglać *plik, zwęglać *stałyargv[]);

Możemy przepisać przykład execv() w następujący sposób:

#włączać

intGłówny(próżnia) {
zwęglać *Nazwa programu= „L”;
zwęglać *argumenty[] = {Nazwa programu, '-lh', '/Dom',ZERO};

execvp(Nazwa programu,argumenty);

powrót 0;
}

Jak widać, wyświetlane jest prawidłowe wyjście.

execle() Funkcja systemowa:

Działa podobnie jak execl(), ale wraz z nim możesz podać własne zmienne środowiskowe. Zmienne środowiskowe są przekazywane jako tablica envp . Ostatni element envp tablica powinna mieć wartość NULL. Wszystkie pozostałe elementy zawierają pary klucz-wartość jako ciąg.

Składnia:

integzekutor(stały zwęglać *ścieżka, stały zwęglać *zły,...,ZERO, zwęglać * stałyenvp[] );

Poniżej podano przykład funkcji systemowej execle():

#włączać

intGłówny(próżnia) {
zwęglać *ścieżka_binarna= '/kosz/bash';
zwęglać *arg1= '-C';
zwęglać *arg2= 'wyrzucił 'Odwiedź $HOSTNAME:$PORT z Twojej przeglądarki.'';
zwęglać *stałyzazdrościć[] = {'NAZWA HOSTA=www.linuxhint.com', 'PORT=8080',ZERO};

egzekutor(ścieżka_binarna,ścieżka_binarna,arg1,arg2,ZERO,zazdrościć);

powrót 0;
}

Przekazałem dwie zmienne środowiskowe NAZWA HOSTA oraz PORT do funkcji execle(). Jak widzisz, mam do nich dostęp z pliku wykonywalnego /bin/bash .

execve() Funkcja systemowa:

Podobnie jak execle(), wraz z execve() możesz podać własne zmienne środowiskowe. Możesz także przekazać argumenty jako tablice, tak jak to zrobiłeś w execv().

Składnia:

intdobry(stały zwęglać *plik, zwęglać *stałyargv[], zwęglać *stałyenvp[]);

Przykład execle() można przepisać w następujący sposób:

#włączać

intGłówny(próżnia) {
zwęglać *ścieżka_binarna= '/kosz/bash';
zwęglać *stałyargumenty[] = {ścieżka_binarna, '-C', 'wyrzucił 'Odwiedź $HOSTNAME:$PORT
z Twojej przeglądarki.'',ZERO};
zwęglać *stałyzazdrościć[] = {'NAZWA HOSTA=www.linuxhint.com', 'PORT=8080',ZERO};

dobry(ścieżka_binarna,argumenty,zazdrościć);

powrót 0;
}

Jak widać, otrzymujemy takie same dane wyjściowe, jak w przykładzie execle().

Tak więc używasz rodziny funkcji exec w C do programowania systemu w Linuksie. Dziękuję za przeczytanie tego artykułu.