Wywołanie systemowe Popen w systemie Linux w języku C

Wywolanie Systemowe Popen W Systemie Linux W Jezyku C



Funkcja popen() wykona polecenie podane przez polecenie ciągu. Funkcja powinna zwrócić wskaźnik do strumienia, który jest używany do odczytu lub zapisu do potoku, jednocześnie tworząc potok między aplikacją wywołującą a wykonywanym poleceniem. Funkcja Popen jest dostępna w standardowej bibliotece funkcji we/wy i uruchamia drugi proces do uruchomienia polecenia terminala. Faza otwarcia funkcji popen() jest taka sama, jak faza otwarcia funkcji fopen(). Funkcja popen() inicjuje proces przez rozwidlenie, konstruowanie potoku i wykonanie powłoki. Ponieważ potok jest domyślnie jednokierunkowy; w rezultacie strumień jest tylko do odczytu lub tylko do zapisu. Po pomyślnym wykonaniu funkcji popen() uzyskuje się otwarty strumień, który jest używany do odczytu i zapisu potoku.”

Przykład 1

Za pomocą następującego przykładowego programu odczytamy pliki, które istnieją w bieżącym katalogu lub folderze za pomocą wywołania systemowego popen. Po pierwsze, wprowadziliśmy plik nagłówkowy stdio.h standardowej biblioteki C. Następnie mamy program int main(), w którym wdrożyliśmy funkcję popen. Wcześniej ustanowiliśmy zmienną wskaźnikową „FileOpen” z klasy „FILE”. Zmienna wskaźnikowa pliku wskazuje kolejny bajt do odczytu lub zapisu.







Następnie przypisaliśmy odczytaną wartość graniczną znaku. Zmienna „FileOpen” wywołała następnie funkcję „popen”. Funkcja „popen” pobiera polecenie „ls -l” systemu Linux, które wyświetla listę wszystkich plików bieżącego katalogu. Ponadto w funkcji popen wprowadziliśmy parametr „r”, który wskazuje tryb odczytu.



Tutaj potoczyliśmy proces odczytu plików za pomocą funkcji popen. Następnie przetworzyliśmy utworzoną rurę za pomocą pętli while. Pętla while używa metod fgets, które pobierają argumenty „line”, „sizeof the line” i „FileOpen”. Fgets odczytuje proces potokowy i zapisuje go w symbolu „%s” ciągu. Ten konkretny symbol jest wywoływany wewnątrz metody printf wraz z argumentem „line”. Po utworzeniu przetworzonego potoku za pomocą funkcji pclosed proces potokowy można zamknąć jako wdrożony na końcu poniższego programu.



#włącz


int main ( )

{

PLIK * PlikOtwórz;

linia znaków [ 130 ] ;


FileOpen = otwórz ( „ls-l” , 'r' ) ;

podczas gdy ( fgets ( linia, rozmiar linii, FileOpen ) )

{

printf ( '%s' , linia ) ;

}

pzamknij ( PlikOtwórz ) ;

}





Funkcja popen programu C rozwidlała powyższy proces, a następnie utworzyła potok. Teraz wykonaliśmy przetworzony potok strumienia w powłoce za pomocą polecenia kompilacji C. Dane wyjściowe wymieniły wszystkie pliki w katalogu „Home”, ponieważ wykonaliśmy program w tym katalogu.



Przykład 2

W poprzednim programie popen mieliśmy prostą demonstrację funkcjonalności programu popen, który służy do potoku procesu strumieniowego odczytu plików. Teraz wzięliśmy inny przykład funkcji popen, w której potokowaliśmy proces w trybie zapisu. Rozważmy program z główną funkcją. Skonstruowaliśmy zmienną wskaźnika pliku wewnątrz funkcji main jako „plik”. Wskaźnik pliku jest wdrażany za pomocą funkcji popen.

Funkcja popen przyjmuje polecenie „cat”, a „w” dla trybu zapisu. Tutaj każdy argument pliku jest sekwencyjnie odczytywany i wysyłany na standardowe wyjście przez polecenie cat. W treści pętli for wykorzystaliśmy funkcję fprintf do wydrukowania wartości liczbowych, ponieważ określiliśmy symbol „%d”. Następnie zamykany jest proces popen pipe z wywołaniem systemowym pclose.

#włącz


int main ( int argc, char ** argv ) {

PLIK * plik = pop ( 'kot' , 'w' ) ;

int x = 0 ;


dla ( x = 0 ;x < 5 ;x++ ) {


fprintf ( plik , 'Moja liczba = %d \n ' , x ) ;
}

pzamknij ( plik ) ;

zwrócić 0 ;

}

Kiedy wykonaliśmy powyższy proces, wypisał on wartości liczników w następujący sposób.

Przykład 3

Teraz mamy inny program, który przenosi dane jednego procesu do innego procesu. Zrobimy to z rurą z funkcji popen. Wdrożyliśmy program przy użyciu standardowych bibliotek C. Następnie mamy int main funkcję wdrażania programu. Tutaj określiliśmy łańcuch w funkcji sprintf z argumentem „buffer”. Funkcja sprintf() przechowuje wynik w buforze znaków dostarczonym przez sprintf, zamiast wysyłać go do znaku zachęty.

Następnie wywołaliśmy funkcję popen wewnątrz zmiennej „read”. Tam mamy dwa procesy wewnątrz funkcji popen. „wc -c” jest pierwszym procesem używanym do zliczania dostarczonych znaków, a drugim procesem jest „w”, który wskazuje, że potok jest otwarty w trybie zapisu. Następnie mamy funkcję „fwrite”, która używa potoku do zapisywania danych. Dane zostaną odebrane przez „wc”, następnie zliczone znaki i wyświetlone w powłoce.

#include

#include

#include

#include

int main ( )

{

PLIK * czytać ;

bufor znaków [ pięćdziesiąt ] ;

sprint ( bufor, „Wywołanie systemu Linux” ) ;

czytać =otwórz ( „wc-c” , 'w' ) ;

fwrite ( bufor, rozmiar ( zwęglać ) ,strlen ( bufor ) , czytać ) ;

pzamknij ( czytać ) ;

}

Znaki wyświetlane w monicie to „17”, ponieważ podany powyżej ciąg zawiera „17” znaków. Proces „wc -c” odczytuje te znaki i drukuje je jako dane wyjściowe.

Przykład 4

Powyższy przykład popen przesyła dane z jednego procesu do drugiego. Tutaj otrzymamy dane z jednego procesu do drugiego za pośrednictwem potoku. Główną funkcją programu jest skonstruowanie bufora, który przyjmuje „50” wartości. Następnie utworzyliśmy zmienną „r”, w której funkcja popen utworzyła proces. Proces „ls” służy do wyświetlania listy plików katalogu, a proces „r” do odczytywania danych z potoku. Proces „ls” przesyła dane do procesu „r” w celu odczytania. Po tym mamy funkcję fread, która odczytuje dane i przechowuje je w buforze. Następnie instrukcja print wydrukuje dane przechowywane w buforze.

#include

#include

#include

#include

int main ( )

{

PLIK * r;

bufor znaków [ pięćdziesiąt ] ;


r = popen ( 'l' , 'r' ) ;

przestraszony ( bufor, 1 , 25 , r ) ;


printf ( '%s \n ' , bufor ) ;

pzamknij ( r ) ;

}

Tutaj tylko „50” znaków istniejących plików jest wyświetlanych z katalogu roboczego. Dlatego wynik będzie miał tylko 50 znaków.

Wniosek

Przedstawiliśmy szczegółową demonstrację wywołań systemowych popen Linuksa w języku C. Zaimplementowaliśmy cztery przykłady, w których wdrożyliśmy funkcję popen. Funkcja popen zwraca strumień potoku zgodnie z przypisanym trybem. W przykładach wykorzystaliśmy zarówno tryb odczytu, jak i zapisu z funkcjami obsługi plików fread i fwrite. Jako pierwszego argumentu użyliśmy nazwy programu w funkcji popen(). Drugim argumentem jest plik „r” jako tryb odczytu lub „w” jako tryb zapisu.