Linux Popen System Call i C

Linux Popen System Call I C



' Funksjonen popen() vil utføre kommandoen gitt av kommandoen til strengen. Funksjonen skal returnere en peker til en strøm som brukes til å lese eller skrive til røret, samtidig som det opprettes et rør mellom den anropende applikasjonen og den utførte kommandoen. Popen-funksjonen er tilgjengelig i standardbiblioteket til I/O-funksjonen og skaper en andre prosess for å kjøre en terminalkommando. Den åpne fasen til popen() er den samme som den åpne fasen i fopen()-funksjonen. Popen()-funksjonen starter en prosess ved å gaffel, konstruere et rør og utføre skallet. Siden et rør er ensrettet som standard; som et resultat er strømmen enten skrivebeskyttet eller skrivebeskyttet. På vellykket kjøring av popen()-funksjonen, oppnås en åpen strøm som brukes for at røret skal lese og skrive.'

Eksempel 1

Med følgende eksempelprogram vil vi lese filene som finnes i gjeldende katalog eller mappe ved å bruke popen-systemkallet. For det første har vi lagt inn stdio.h-headerfilen til C-standardbiblioteket. Deretter har vi et program int main()-funksjon der vi har distribuert popen-funksjonen. Før dette etablerte vi pekervariabelen 'FileOpen' fra klassen 'FILE'. Pekervariabelen til filen indikerer den etterfølgende byten som skal leses eller skrives.







Etter det tildelte vi karakterens grenseverdi som skulle leses. Variabelen 'FileOpen' påkalte deretter 'popen'-funksjonen. 'Popen'-funksjonen tar kommandoen 'ls -l' til Linux, som vil liste alle filene i gjeldende katalog. I tillegg har vi lagt inn 'r'-parameteren i popen-funksjonen, som indikerer lesemodus.



Her har vi ledet filene leseprosessen ved å bruke popen-funksjonen. Deretter behandlet vi det opprettede røret med while-løkken. While-løkken bruker fgets-metodene, som tar argumentene 'line', 'sizeof the line' og 'FileOpen'. Fgetene leste rørprosessen og lagret den i '%s'-symbolet til strengen. Dette spesielle symbolet kalles inne i printf-metoden sammen med 'linje'-argumentet. Når vi har opprettet røret behandlet, med pclosed-funksjonen, kan rørprosessen lukkes som distribuert på slutten av programmet nedenfor.



#include


int main ( )

{

FIL * FileOpen;

røye linje [ 130 ] ;


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

samtidig som ( fgets ( linje, størrelse på linje, FileOpen ) )

{

printf ( '%s' , linje ) ;

}

pclukk ( Åpne fil ) ;

}





Popen-funksjonen til C-programmet gaflet prosessen ovenfor og skapte deretter røret. Nå har vi utført det behandlede røret til strømmen i skallet med C-kompileringskommandoen. Utgangen har listet opp alle filene i 'Hjem'-katalogen ettersom vi har kjørt programmet i den katalogen.



Eksempel 2

I det forrige popen-programmet har vi en enkel demonstrasjon av funksjonaliteten til popen-programmet som brukes til å pipe strømmeprosessen med å lese filer. Nå har vi tatt et annet eksempel på popen-funksjonen der vi har overført prosessen med skrivemodus. La oss vurdere programmet med hovedfunksjonen. Vi har konstruert filpekervariabelen inne i hovedfunksjonen som 'fil'. Filpekeren er distribuert med popen-funksjonen.

Popen-funksjonen tar 'cat'-kommandoen og 'w' for skrivemodus. Her blir hvert File-argument sekvensielt lest og sendt til standardutgang av cat-kommandoen. I for loop-kroppen har vi brukt fprintf-funksjonen til å skrive ut de numeriske telleverdiene ettersom vi har spesifisert symbolet '%d'. Deretter lukket, popen pipe-prosessen med pclose system call.

#include


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

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

int x = 0 ;


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


fprintf ( fil , 'Min telling = %d \n ' , x ) ;
}

pclukk ( fil ) ;

komme tilbake 0 ;

}

Da vi utførte den ovenfor opprettede prosessen, skrev den ut telleverdiene på følgende måte.

Eksempel 3

Nå har vi et annet program som overfører data fra en prosess til en annen prosess. Dette skal vi gjøre med pipen fra popen-funksjonen. Vi har implementert programmet ved å bruke standardbibliotekene til C. Deretter har vi en int-hovedfunksjon for å distribuere et program. Her har vi spesifisert strengen i sprintf-funksjonen med 'buffer'-argumentet. Funksjonen sprintf() beholder resultatet på char-bufferen levert av sprintf i stedet for å sende det til ledeteksten.

Etter det kalte vi popen-funksjonen inne i 'les'-variabelen. Der har vi to prosesser inne i popen-funksjonen. 'wc -c' er den første prosessen som brukes til å telle de angitte tegnene, og den andre prosessen er 'w', som indikerer at røret er åpent i skrivemodus. Etter det har vi 'fwrite'-funksjonen som bruker pipen til å skrive data. Dataene vil bli mottatt av 'wc', så telles tegnet og vises i skallet.

#include

#include

#include

#include

int main ( )

{

FIL * lese ;

char buffer [ femti ] ;

sprintf ( buffer, 'Linux-systemanrop' ) ;

lese =åpne ( 'wc -c' , 'i' ) ;

fskriv ( buffer, størrelse på ( røye ) ,strlen ( buffer ) , lese ) ;

pclukk ( lese ) ;

}

Tegnene som vises i ledeteksten er '17' fordi strengen vi har spesifisert ovenfor inneholder '17' tegn. 'wc -c'-prosessen leser disse tegnene og skriver dem ut som utdata.

Eksempel 4

Eksempelet ovenfor på popen sender dataene fra en prosess til en annen. Her vil vi motta dataene fra den ene prosessen til den andre prosessen via et rør. Hovedfunksjonen til programmet er å konstruere bufferen, som tar '50' verdier. Deretter opprettet vi variabelen 'r', der popen-funksjonen opprettet prosessen. 'ls'-prosessen brukes til å liste filene i katalogen, og 'r'-prosessen for å lese dataene fra røret. 'ls'-prosessen overfører dataene til 'r'-prosessen for å lese. Etter dette har vi fread-funksjonen, som leser dataene og lagrer dataene i bufferen. Deretter vil utskriftssetningen skrive ut dataene som er lagret i bufferen.

#include

#include

#include

#include

int main ( )

{

FIL * r;

char buffer [ femti ] ;


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

fread ( buffer, 1 , 25 , r ) ;


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

pclukk ( r ) ;

}

Her vises bare '50' tegn av eksisterende filer fra arbeidskatalogen. Derfor vil utgangen bare ha 50 tegn.

Konklusjon

Vi har gitt en detaljert demonstrasjon av Linux popen-systemanrop på C-språk. Vi har implementert fire eksempler hvor vi har implementert popen-funksjonen. Popen-funksjonen returnerer rørstrømmen i henhold til modusen vi har tildelt. I eksemplene har vi brukt både lese- og skrivemodus med filhåndteringsfunksjonene fread og fwrite. Vi har brukt navnet på programmet i popen()-funksjonen som det første argumentet. Det andre argumentet er en fil 'r' som lese eller 'w' som skrivemodus.