„Linux Popen“ sistemos skambutis C

Linux Popen Sistemos Skambutis C



Funkcija popen () vykdys komandą, kurią duos eilutės komanda. Funkcija turėtų grąžinti žymeklį į srautą, kuris naudojamas nuskaityti arba rašyti į vamzdį, kartu sukuriant vamzdį tarp iškvietimo programos ir vykdomos komandos. Funkcija Popen pasiekiama standartinėje I/O funkcijos bibliotekoje ir sukuria antrą procesą terminalo komandai vykdyti. Popen() atviroji fazė yra tokia pati kaip ir funkcijos fopen() atviroji fazė. Funkcija popen() inicijuoja procesą šakėmis, sukonstruodama vamzdį ir vykdydama apvalkalą. Kadangi pagal nutylėjimą vamzdis yra vienakryptis; dėl to srautas yra tik skaitomas arba tik rašomas. Sėkmingai vykdant popen() funkciją, gaunamas atviras srautas, naudojamas vamzdžiui skaityti ir rašyti.

1 pavyzdys

Naudodami šią pavyzdinę programą, mes perskaitysime failus, esančius dabartiniame kataloge ar aplanke, naudodami popen sistemos iškvietimą. Pirma, mes įvedėme C standartinės bibliotekos stdio.h antraštės failą. Tada turime programos int main() funkciją, kurioje įdiegėme popen funkciją. Prieš tai mes sukūrėme žymeklio kintamąjį „FileOpen“ iš klasės „FILE“. Failo rodyklės kintamasis nurodo kitą baitą, kurį reikia skaityti arba rašyti.







Po to mes priskyrėme simbolio ribinę reikšmę, kurią reikia perskaityti. Tada kintamasis „FileOpen“ iškvietė „popen“ funkciją. Funkcija „popen“ paima „Linux“ komandą „ls -l“, kuri išvardys visus dabartinio katalogo failus. Be to, į popen funkciją įvedėme parametrą „r“, kuris nurodo skaitymo režimą.



Čia mes sujungėme failų skaitymo procesą naudodami popen funkciją. Toliau mes apdorojome sukurtą vamzdį su while kilpa. Nors ciklas naudoja fgets metodus, kurie naudoja argumentus „line“, „sizeof line“ ir „FileOpen“. Fgets nuskaito vamzdžių procesą ir įrašė jį į eilutės simbolį „%s“. Šis konkretus simbolis vadinamas printf metodu kartu su argumentu „linija“. Sukūrus apdorotą vamzdį, naudojant funkciją „pcclose“, vamzdžių procesą galima uždaryti, kaip nurodyta toliau pateiktos programos pabaigoje.



#include


tarp pagrindinis ( )

{

FAILAS * FileOpen;

anglies linija [ 130 ] ;


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

kol ( fgets ( eilutė, eilutės dydis, failo atidarymas ) )

{

printf ( „%s“ , linija ) ;

}

pclose ( Failas Atidaryti ) ;

}





C programos popen funkcija paskatino aukščiau aprašytą procesą ir tada sukūrė vamzdį. Dabar mes įvykdėme apdorotą srauto vamzdį apvalkale su C kompiliavimo komanda. Išvestyje buvo išvardyti visi failai kataloge „Pagrindinis“, nes tame kataloge vykdėme programą.



2 pavyzdys

Ankstesnėje „popen“ programoje turime paprastą popen programos, naudojamos failų skaitymo srautui perduoti, funkcionalumą. Dabar paėmėme dar vieną popen funkcijos pavyzdį, kuriame procesą sujungėme su rašymo režimu. Panagrinėkime programą su pagrindine funkcija. Mes sukūrėme failo žymeklio kintamąjį pagrindinės funkcijos viduje kaip „failas“. Failo žymeklis įdiegtas naudojant popen funkciją.

Popen funkcija naudoja komandą „cat“ ir „w“ rašymo režimui. Čia kiekvienas failo argumentas yra nuosekliai nuskaitomas ir siunčiamas į standartinę išvestį komanda cat. For ciklo korpuse panaudojome fprintf funkciją, norėdami atspausdinti skaitines reikšmes, nes nurodėme simbolį „%d“. Tada uždarytas „popen vamzdžio“ procesas su „pclose“ sistemos iškvietimu.

#include


tarp pagrindinis ( int argc, char ** argv ) {

FAILAS * failą = popen ( 'katė' , 'į' ) ;

int x = 0 ;


dėl ( x = 0 ;x < 5 ;x++ ) {


fprintf ( failą , „Mano skaičius = %d \n , x ) ;
}

pclose ( failą ) ;

grąžinti 0 ;

}

Kai atlikome aukščiau sukurtą procesą, jis išspausdino skaičiavimo reikšmes tokiu būdu.

3 pavyzdys

Dabar turime kitą programą, kuri perkelia vieno proceso duomenis į kitą procesą. Tai padarysime su vamzdžiu iš popen funkcijos. Mes įdiegėme programą naudodami standartines C bibliotekas. Tada turime pagrindinę programos diegimo funkciją. Čia mes nurodėme eilutę funkcijoje sprintf su argumentu „buferis“. Funkcija sprintf() išlaiko rezultatą sprintf pateiktame char buferyje, o ne siunčia jį į raginimą.

Po to kintamojo „skaityti“ viduje pavadinome popen funkciją. Ten mes turime du procesus popen funkcijos viduje. „wc -c“ yra pirmasis procesas, naudojamas pateiktiems simboliams skaičiuoti, o antrasis procesas yra „w“, kuris rodo, kad vamzdis atidarytas rašymo režimu. Po to turime funkciją „fwrite“, kuri naudoja vamzdį duomenims įrašyti. Duomenis gaus „wc“, tada suskaičiuos simbolį ir bus rodomas apvalkale.

#include

#include

#include

#įtraukti

tarp pagrindinis ( )

{

FAILAS * skaityti ;

char buferis [ penkiasdešimt ] ;

sprintf ( buferis, 'Linux sistemos skambutis' ) ;

skaityti = atidaryti ( 'wc -c' , 'į' ) ;

fwrite ( buferis, dydis ( char ) ,strlen ( buferis ) , skaityti ) ;

pclose ( skaityti ) ;

}

Raginime rodomi simboliai yra „17“, nes pirmiau nurodytoje eilutėje yra „17“ simbolių. Procesas „wc -c“ nuskaito šiuos simbolius ir išspausdina juos kaip išvestį.

4 pavyzdys

Aukščiau pateiktas popen pavyzdys siunčia duomenis iš vieno proceso į kitą. Čia mes gausime duomenis iš vieno proceso į kitą procesą per vamzdį. Pagrindinė programos funkcija yra sukurti buferį, kuris užima „50“ reikšmių. Tada sukūrėme kintamąjį „r“, kur popen funkcija sukūrė procesą. „ls“ procesas naudojamas katalogo failams išvardyti, o „r“ procesas duomenims iš vamzdžio nuskaityti. „ls“ procesas perduoda duomenis „r“ procesui, kad būtų galima nuskaityti. Po to turime fread funkciją, kuri nuskaito duomenis ir išsaugo duomenis buferyje. Tada spausdinimo teiginys išspausdins buferyje saugomus duomenis.

#include

#include

#include

#įtraukti

tarp pagrindinis ( )

{

FAILAS * r;

char buferis [ penkiasdešimt ] ;


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

nusibosti ( buferis, 1 , 25 , r ) ;


printf ( '%s \n , buferis ) ;

pclose ( r ) ;

}

Čia iš darbo katalogo rodomi tik „50“ esamų failų simbolių. Todėl išvestyje bus tik 50 simbolių.

Išvada

Pateikėme išsamų Linux popen sistemos skambučių demonstravimą C kalba. Įdiegėme keturis pavyzdžius, kuriuose įdiegėme popen funkciją. Funkcija popen grąžina vamzdžio srautą pagal mūsų priskirtą režimą. Pavyzdžiuose naudojome skaitymo ir rašymo režimus su failų tvarkymo funkcijomis fread ir fwrite. Kaip pirmąjį argumentą naudojome programos pavadinimą popen() funkcijoje. Antrasis argumentas yra failas „r“ kaip skaitymas arba „w“ kaip rašymo režimas.