Linux Popen System Call i C

Linux Popen System Call I C



Popen()-funktionen udfører kommandoen givet af strengens kommando. Funktionen skal returnere en pointer til en strøm, der bruges til at læse eller skrive til røret, samtidig med at der oprettes et rør mellem det kaldende program og den udførte kommando. Popen-funktionen er tilgængelig i standardbiblioteket for I/O-funktionen og afføder en anden proces til at køre en terminalkommando. Den åbne fase af popen() er den samme som den åbne fase i fopen()-funktionen. Popen()-funktionen starter en proces ved at gaffel, konstruere et rør og udføre skallen. Da et rør som standard er ensrettet; som følge heraf er strømmen enten skrivebeskyttet eller skrivebeskyttet. På succesfuld udførelse af popen()-funktionen opnås en åben strøm, der bruges til at røret kan læse og skrive.'

Eksempel 1

Med følgende eksempelprogram læser vi de filer, der findes i den aktuelle mappe eller mappe ved hjælp af popen-systemkaldet. For det første har vi indtastet stdio.h header-filen i C-standardbiblioteket. Derefter har vi et program int main()-funktion, hvor vi har implementeret popen-funktionen. Før dette etablerede vi pointervariablen 'FileOpen' fra klassen 'FILE'. Filens pointervariabel angiver den efterfølgende byte, der skal læses eller skrives.







Derefter tildelte vi karakterens grænseværdi, der skulle læses. Variablen 'FileOpen' påkaldte derefter 'pop'-funktionen. 'Popen'-funktionen tager kommandoen 'ls -l' i Linux, som viser alle filerne i den aktuelle mappe. Desuden har vi indtastet 'r'-parameteren i popen-funktionen, som angiver læsetilstanden.



Her har vi overført filernes læseproces ved at bruge popen-funktionen. Dernæst behandlede vi det oprettede rør med while-løkken. While-løkken bruger fgets-metoderne, som tager argumenterne 'line', 'sizeof the line' og 'FileOpen'. Fget'erne læste rørprocessen og gemte den i '%s'-symbolet for streng. Dette særlige symbol kaldes inde i printf-metoden sammen med 'line'-argumentet. Når vi har oprettet røret behandlet, med pclosed-funktionen, kan rørprocessen lukkes som implementeret i slutningen af ​​nedenstående program.



#include


int main ( )

{

FIL * FileOpen;

char linje [ 130 ] ;


FileOpen = popen ( 'ls -l' , 'r' ) ;

mens ( fgets ( linje, linjestørrelse, FileOpen ) )

{

printf ( '%s' , linje ) ;

}

lukke ( Fil Åbn ) ;

}





Popen-funktionen i C-programmet forgrenede ovenstående proces og skabte derefter røret. Nu har vi udført det behandlede rør i strømmen i skallen med C-kompileringskommandoen. Outputtet har listet alle filerne i 'Hjem'-mappen, da vi har udført programmet i den mappe.



Eksempel 2

I det tidligere popen-program har vi en simpel demonstration af funktionaliteten af ​​popen-programmet, der bruges til at pibe streamingprocessen med at læse filer. Nu har vi taget endnu et eksempel på popen-funktionen, hvor vi har overført processen med skrivetilstanden. Lad os overveje programmet med hovedfunktionen. Vi har konstrueret filpegevariablen inde i hovedfunktionen som 'fil'. Filmarkøren er implementeret med popen-funktionen.

Popen-funktionen tager kommandoen 'cat' og 'w' for skrivetilstand. Her læses hvert File-argument sekventielt og sendes til standardoutput af cat-kommandoen. I for loop-legemet har vi brugt fprintf-funktionen til at udskrive de numeriske tælleværdier, da vi har angivet symbolet '%d'. Derefter lukket, popen pipe-processen med pclose-systemkaldet.

#include


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

FIL * fil = popen ( 'kat' , 'i' ) ;

int x = 0 ;


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


fprintf ( fil , 'Min optælling = %d \n ' , x ) ;
}

lukke ( fil ) ;

Vend tilbage 0 ;

}

Da vi udførte den ovenfor oprettede proces, udskrev den tælleværdierne på følgende måde.

Eksempel 3

Nu har vi et andet program, der overfører data fra en proces til en anden proces. Det vil vi gøre med røret fra popen-funktionen. Vi har implementeret programmet ved at bruge standardbibliotekerne i C. Derefter har vi en int-hovedfunktion til at implementere et program. Her har vi specificeret strengen i sprintf-funktionen med 'buffer'-argumentet. Funktionen sprintf() beholder resultatet på char-bufferen fra sprintf i stedet for at sende det til prompten.

Derefter kaldte vi popen-funktionen inde i 'læse'-variablen. Der har vi to processer inde i popen-funktionen. 'wc -c' er den første proces, der bruges til at tælle de angivne tegn, og den anden proces er 'w', som indikerer, at røret er åbent i skrivetilstand. Derefter har vi funktionen 'fwrite', der bruger røret til at skrive data. Dataene modtages af 'wc', hvorefter tegnet tælles og vises i skallen.

#include

#include

#include

#include

int main ( )

{

FIL * Læs ;

kul buffer [ halvtreds ] ;

sprintf ( buffer, 'Linux-systemopkald' ) ;

Læs =åbn ( 'wc -c' , 'i' ) ;

fwrite ( buffer, størrelse af ( char ) ,strlen ( buffer ) , Læs ) ;

lukke ( Læs ) ;

}

Tegnene, der vises i prompten, er '17', fordi strengen, vi har angivet ovenfor, indeholder '17' tegn. 'wc -c'-processen læser disse tegn og udskriver dem som output.

Eksempel 4

Ovenstående eksempel på popen sender data fra én proces til en anden. Her vil vi modtage data fra den ene proces til den anden proces via et rør. Programmets hovedfunktion er at konstruere bufferen, som tager '50' værdier. Derefter oprettede vi variablen 'r', hvor popen-funktionen skabte processen. 'ls'-processen bruges til at liste filerne i mappen, og 'r'-processen til at læse data fra røret. 'ls'-processen transmitterer dataene til 'r'-processen for at læse. Herefter har vi fread-funktionen, som læser dataene og gemmer dataene i bufferen. Derefter udskriver udskriftserklæringen de data, der er gemt i bufferen.

#include

#include

#include

#include

int main ( )

{

FIL * r;

kul buffer [ halvtreds ] ;


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

fread ( buffer, 1 , 25 , r ) ;


printf ( '%s \n ' buffer ) ;

lukke ( r ) ;

}

Her vises kun '50' tegn af de eksisterende filer fra arbejdsbiblioteket. Derfor vil output kun have 50 tegn.

Konklusion

Vi har givet en detaljeret demonstration af Linux popen-systemkald i C-sprog. Vi har implementeret fire eksempler, hvor vi har implementeret popen-funktionen. Popen-funktionen returnerer rørstrømmen i henhold til den tilstand, vi har tildelt. I eksemplerne har vi brugt både læse- og skrivetilstanden med filhåndteringsfunktionerne fread og fwrite. Vi har brugt navnet på programmet i popen()-funktionen som dets første argument. Det andet argument er en fil 'r' som læst eller 'w' som skrivetilstand.