Linux-Popen-Systemaufruf in C

Linux Popen Systemaufruf In C



Die Funktion popen() führt den Befehl aus, der durch den Befehl der Zeichenfolge gegeben wird. Die Funktion sollte einen Zeiger auf einen Stream zurückgeben, der zum Lesen oder Schreiben in die Pipe verwendet wird, während sie gleichzeitig eine Pipe zwischen der aufrufenden Anwendung und dem ausgeführten Befehl erstellt. Die Popen-Funktion ist in der Standardbibliothek der E/A-Funktion verfügbar und erzeugt einen zweiten Prozess, um einen Terminalbefehl auszuführen. Die Öffnungsphase von popen() ist dieselbe wie die Öffnungsphase in der Funktion fopen(). Die Funktion popen() initiiert einen Prozess, indem sie sich verzweigt, eine Pipe konstruiert und die Shell ausführt. Da eine Pipe standardmäßig unidirektional ist; folglich ist der Stream entweder schreibgeschützt oder schreibgeschützt. Bei erfolgreicher Ausführung der popen()-Funktion wird ein offener Stream abgerufen, der für die Pipe zum Lesen und Schreiben verwendet wird.“

Beispiel 1

Mit dem folgenden Beispielprogramm lesen wir die Dateien, die im aktuellen Verzeichnis oder Ordner vorhanden sind, mit dem Systemaufruf popen. Zunächst haben wir die Header-Datei stdio.h der C-Standardbibliothek eingegeben. Dann haben wir eine program int main()-Funktion, in der wir die Popen-Funktion bereitgestellt haben. Zuvor haben wir die Zeigervariable „FileOpen“ aus der Klasse „FILE“ eingerichtet. Die Zeigervariable der Datei zeigt das nachfolgende zu lesende oder zu schreibende Byte an.







Danach weisen wir dem zu lesenden Zeichen den Grenzwert zu. Die Variable „FileOpen“ hat dann die Funktion „popen“ aufgerufen. Die Funktion „popen“ übernimmt den Befehl „ls -l“ von Linux, der alle Dateien des aktuellen Verzeichnisses auflistet. Außerdem haben wir in der Popen-Funktion den Parameter „r“ eingegeben, der den Lesemodus anzeigt.



Hier haben wir den Leseprozess der Dateien mithilfe der Popen-Funktion umgeleitet. Als nächstes verarbeiteten wir die erstellte Pipe mit der While-Schleife. Die while-Schleife verwendet die fgets-Methoden, die die Argumente „line“, „sizeof the line“ und „FileOpen“ annehmen. Die fgets lesen den geleiteten Prozess und speichern ihn im „%s“-Symbol der Zeichenfolge. Dieses spezielle Symbol wird innerhalb der printf-Methode zusammen mit dem „line“-Argument aufgerufen. Sobald wir die verarbeitete Pipe mit der pclosed-Funktion erstellt haben, kann der geleitete Prozess geschlossen werden, wie er am Ende des folgenden Programms bereitgestellt wird.



#include


int Haupt ( )

{

DATEI * Datei öffnen;

Zeichenzeile [ 130 ] ;


DateiÖffnen = popen ( 'ls -l' , 'r' ) ;

während ( fgets ( line, sizeof line, FileOpen ) )

{

Druckf ( '%s' , Linie ) ;

}

schließen ( Datei öffnen ) ;

}





Die Popen-Funktion des C-Programms hat den obigen Prozess gegabelt und dann die Pipe erstellt. Nun haben wir die verarbeitete Pipe des Streams in der Shell mit dem C-Kompilierungsbefehl ausgeführt. Die Ausgabe hat alle Dateien im „Home“-Verzeichnis aufgelistet, da wir das Programm in diesem Verzeichnis ausgeführt haben.



Beispiel 2

Im vorherigen Popen-Programm haben wir eine einfache Demonstration der Funktionalität des Popen-Programms, das zum Weiterleiten des Streaming-Prozesses zum Lesen von Dateien verwendet wird. Jetzt haben wir ein weiteres Beispiel für die Popen-Funktion genommen, bei dem wir den Prozess mit dem Schreibmodus geleitet haben. Betrachten wir das Programm mit der Hauptfunktion. Wir haben die Dateizeigervariable innerhalb der Hauptfunktion als „Datei“ konstruiert. Der Dateizeiger wird mit der Popen-Funktion bereitgestellt.

Die Popen-Funktion nimmt den Befehl „cat“ und das „w“ für den Schreibmodus. Hier wird jedes File-Argument sequentiell gelesen und vom cat-Befehl an die Standardausgabe gesendet. Im Körper der For-Schleife haben wir die Funktion fprintf verwendet, um die numerischen Zählwerte zu drucken, da wir das Symbol „%d“ angegeben haben. Anschließend wird der Popen-Pipe-Prozess mit dem Systemaufruf pclose geschlossen.

#include


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

DATEI * Datei = poppen ( 'Katze' , 'in' ) ;

Ganzzahl x = 0 ;


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


fprintf ( Datei , 'Meine Zählung = %d \n ' , x ) ;
}

schließen ( Datei ) ;

Rückkehr 0 ;

}

Als wir den oben erstellten Prozess ausgeführt haben, wurden die Zählwerte auf folgende Weise gedruckt.

Beispiel 3

Jetzt haben wir ein anderes Programm, das die Daten eines Prozesses an einen anderen Prozess überträgt. Wir werden dies mit der Pipe aus der Popen-Funktion tun. Wir haben das Programm unter Verwendung der Standardbibliotheken von C implementiert. Dann haben wir eine int-Hauptfunktion zum Bereitstellen eines Programms. Hier haben wir den String in der Funktion sprintf mit dem Argument „buffer“ angegeben. Die Funktion sprintf() behält das Ergebnis im char-Puffer, der von sprintf bereitgestellt wird, anstatt es an die Eingabeaufforderung zu senden.

Danach haben wir die popen-Funktion innerhalb der „read“-Variablen aufgerufen. Dort haben wir zwei Prozesse innerhalb der Popen-Funktion. Das „wc -c“ ist der erste Prozess, der zum Zählen der bereitgestellten Zeichen verwendet wird, und der zweite Prozess ist das „w“, das anzeigt, dass die Pipe im Schreibmodus geöffnet ist. Danach haben wir die Funktion „fwrite“, die die Pipe zum Schreiben von Daten verwendet. Die Daten werden vom „wc“ entgegengenommen, dann die Zeichen gezählt und in der Shell angezeigt.

#include

#include

#include

#include

int Haupt ( )

{

DATEI * lesen ;

Zeichenpuffer [ fünfzig ] ;

Sprintf ( Puffer, 'Linux-Systemaufruf' ) ;

lesen = popen ( 'wc -c' , 'in' ) ;

fschreiben ( Puffer, Größevon ( verkohlen ) ,strlen ( Puffer ) , lesen ) ;

schließen ( lesen ) ;

}

Die in der Eingabeaufforderung angezeigten Zeichen sind „17“, da die oben angegebene Zeichenfolge „17“ Zeichen enthält. Der Prozess „wc -c“ liest diese Zeichen und gibt sie als Ausgabe aus.

Beispiel 4

Das obige Beispiel von popen sendet die Daten von einem Prozess an einen anderen. Hier erhalten wir die Daten von einem Prozess zum anderen Prozess über eine Pipe. Die Hauptfunktion des Programms besteht darin, den Puffer zu konstruieren, der „50“ Werte annimmt. Dann haben wir die Variable „r“ erstellt, wo die Popen-Funktion den Prozess erstellt hat. Der Prozess „ls“ dient zum Auflisten der Dateien des Verzeichnisses und der Prozess „r“ zum Lesen der Daten aus der Pipe. Der „ls“-Prozess überträgt die Daten zum Lesen an den „r“-Prozess. Danach haben wir die fread-Funktion, die die Daten liest und die Daten im Puffer speichert. Dann druckt die Druckanweisung die im Puffer gespeicherten Daten.

#include

#include

#include

#include

int Haupt ( )

{

DATEI * r;

Zeichenpuffer [ fünfzig ] ;


r = Popen ( 'ls' , 'r' ) ;

Angst ( Puffer, 1 , 25 , r ) ;


Druckf ( '%s \n ' , Puffer ) ;

schließen ( r ) ;

}

Hier werden nur „50“ Zeichen der vorhandenen Dateien aus dem Arbeitsverzeichnis angezeigt. Daher hat die Ausgabe nur 50 Zeichen.

Fazit

Wir haben eine detaillierte Demonstration von Linux-Popen-Systemaufrufen in C-Sprache gegeben. Wir haben vier Beispiele implementiert, in denen wir die Popen-Funktion eingesetzt haben. Die Popen-Funktion gibt den Pipe-Stream gemäß dem von uns zugewiesenen Modus zurück. In den Beispielen haben wir sowohl den Lese- als auch den Schreibmodus mit den Dateibehandlungsfunktionen fread und fwrite verwendet. Wir haben den Namen des Programms in der Funktion popen() als erstes Argument verwendet. Das zweite Argument ist eine Datei „r“ als Lese- oder „w“ als Schreibmodus.