Systémové volanie Linuxu Popen v C

Systemove Volanie Linuxu Popen V C



Funkcia popen() vykoná príkaz daný príkazom reťazca. Funkcia by mala vrátiť smerník na tok, ktorý sa používa na čítanie alebo zápis do potrubia a zároveň by mal vytvoriť prepojenie medzi volajúcou aplikáciou a vykonaným príkazom. Funkcia Popen je dostupná v štandardnej knižnici funkcie I/O a vytvorí druhý proces na spustenie príkazu terminálu. Otvorená fáza funkcie popen() je rovnaká ako otvorená fáza funkcie fopen(). Funkcia popen() iniciuje proces rozdvojením, vytvorením potrubia a spustením shellu. Keďže potrubie je štandardne jednosmerné; v dôsledku toho je prúd určený len na čítanie alebo len na zápis. Pri úspešnom vykonaní funkcie popen() sa získa otvorený prúd, ktorý sa používa na čítanie a zápis z potrubia.

Príklad 1

Pomocou nasledujúceho vzorového programu prečítame súbory, ktoré existujú v aktuálnom adresári alebo priečinku, pomocou systémového volania popen. Najprv sme vložili hlavičkový súbor stdio.h štandardnej knižnice C. Potom máme funkciu int main(), kde sme nasadili funkciu popen. Predtým sme vytvorili premennú ukazovateľa „FileOpen“ z triedy „FILE“. Premenná ukazovateľa súboru označuje nasledujúci bajt na čítanie alebo zápis.







Potom sme priradili limitnú hodnotu znaku, ktorá sa má prečítať. Premenná „FileOpen“ potom vyvolala funkciu „popen“. Funkcia „popen“ preberá príkaz „ls -l“ systému Linux, ktorý zobrazí zoznam všetkých súborov aktuálneho adresára. Okrem toho sme do funkcie popen zadali parameter „r“, ktorý označuje režim čítania.



Tu sme zaviedli proces čítania súborov pomocou funkcie popen. Ďalej sme vytvorenú fajku spracovali slučkou while. Cyklus while používa metódy fgets, ktoré preberajú argumenty „line“, „veľkosť riadku“ a „FileOpen“. Fgety načítajú pipetovaný proces a uložia ho do symbolu „%s“ reťazca. Tento konkrétny symbol sa volá v metóde printf spolu s argumentom „line“. Akonáhle sme vytvorili potrubie spracované pomocou funkcie plosed, proces potrubia môže byť uzavretý tak, ako je nasadený na konci nižšie uvedeného programu.



#include


int main ( )

{

FILE * FileOpen;

char line [ 130 ] ;


FileOpen = otvoriť ( 'ls -l' , 'r' ) ;

zatiaľ čo ( fgets ( riadok, veľkosť riadku, FileOpen ) )

{

printf ( '%s' , riadok ) ;

}

zavrieť ( FileOpen ) ;

}





Funkcia popen programu C rozdelila vyššie uvedený proces a potom vytvorila potrubie. Teraz sme pomocou príkazu C kompilácie vykonali spracované potrubie prúdu v shelli. Výstup obsahuje zoznam všetkých súborov v adresári „Home“, keď sme v tomto adresári spustili program.



Príklad 2

V predchádzajúcom programe popen máme jednoduchú ukážku funkčnosti programu popen, ktorý sa používa na prepojenie procesu streamovania čítania súborov. Teraz sme vzali ďalší príklad funkcie popen, kde sme proces prepojili s režimom zápisu. Zoberme si program s hlavnou funkciou. Skonštruovali sme premennú ukazovateľa súboru vo vnútri hlavnej funkcie ako „súbor“. Ukazovateľ súboru je nasadený s funkciou popen.

Funkcia popen preberá príkaz „cat“ a „w“ pre režim zápisu. Tu sa každý argument súboru postupne načíta a odošle na štandardný výstup príkazom cat. V tele cyklu for sme použili funkciu fprintf na vytlačenie číselných hodnôt počtu, keďže sme zadali symbol „%d“. Potom sa zatvorí proces popen pipe so systémovým volaním pclose.

#include


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

FILE * súbor = pápež ( 'mačka' , 'v' ) ;

int x = 0 ;


pre ( X = 0 ;X < 5 ;x++ ) {


fprintf ( súbor , 'Môj počet = %d.' \n ' , X ) ;
}

zavrieť ( súbor ) ;

vrátiť 0 ;

}

Keď sme vykonali vyššie vytvorený proces, vytlačili sa hodnoty počtu nasledujúcim spôsobom.

Príklad 3

Teraz máme ďalší program, ktorý prenáša údaje jedného procesu do iného procesu. Urobíme to fajkou z funkcie popen. Program sme implementovali pomocou štandardných knižníc jazyka C. Potom máme funkciu int main na nasadenie programu. Tu sme zadali reťazec vo funkcii sprintf s argumentom „buffer“. Funkcia sprintf() uchováva výsledok vo vyrovnávacej pamäti znakov, ktorú poskytuje sprintf, namiesto toho, aby ho posielala do výzvy.

Potom sme zavolali funkciu popen vo vnútri premennej „read“. Vo funkcii popen máme dva procesy. „wc -c“ je prvý proces, ktorý sa používa na počítanie poskytnutých znakov, a druhý proces je „w“, čo znamená, že potrubie je otvorené v režime zápisu. Potom máme funkciu „fwrite“, ktorá používa potrubie na zapisovanie údajov. Dáta prijme „wc“, potom spočíta znak a zobrazí sa v shelli.

#include

#include

#include

#include

int main ( )

{

FILE * čítať ;

char buffer [ päťdesiat ] ;

sprintf ( nárazník, 'Systémový hovor Linux' ) ;

čítať =pápež ( 'wc -c' , 'v' ) ;

fwrite ( buffer,veľkosť ( char ) ,strlen ( vyrovnávacej pamäte ) , čítať ) ;

zavrieť ( čítať ) ;

}

Znaky zobrazené vo výzve sú „17“, pretože reťazec, ktorý sme špecifikovali vyššie, obsahuje „17“ znakov. Proces „wc -c“ prečíta tieto znaky a vytlačí ich ako výstup.

Príklad 4

Vyššie uvedený príklad popen posiela údaje z jedného procesu do druhého. Tu budeme prijímať údaje z jedného procesu do druhého procesu cez potrubie. Hlavnou funkciou programu je zostaviť vyrovnávaciu pamäť, ktorá naberá hodnoty „50“. Potom sme vytvorili premennú „r“, kde funkcia popen vytvorila proces. Proces „ls“ sa používa na zoznam súborov v adresári a proces „r“ na čítanie údajov z potrubia. Proces „ls“ prenáša údaje do procesu „r“ na prečítanie. Potom máme funkciu fread, ktorá načíta dáta a uloží dáta do vyrovnávacej pamäte. Potom tlačový príkaz vytlačí údaje uložené vo vyrovnávacej pamäti.

#include

#include

#include

#include

int main ( )

{

FILE * r;

char buffer [ päťdesiat ] ;


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

fred ( nárazník, 1 , 25 , r ) ;


printf ( '%s \n ' , vyrovnávacia pamäť ) ;

zavrieť ( r ) ;

}

Tu sa zobrazí iba „50“ znakov existujúcich súborov z pracovného adresára. Preto bude mať výstup iba 50 znakov.

Záver

Poskytli sme podrobnú ukážku volaní systému Linux popen v jazyku C. Implementovali sme štyri príklady, kde sme nasadili funkciu popen. Funkcia popen vracia prúd potrubia podľa režimu, ktorý sme priradili. V príkladoch sme použili režim čítania aj zápisu s funkciami spracovania súborov fread a fwrite. Ako prvý argument sme použili názov programu vo funkcii popen(). Druhým argumentom je súbor „r“ ako režim čítania alebo „w“ ako režim zápisu.