Linux Popen rendszerhívás C nyelven

Linux Popen Rendszerhivas C Nyelven



' A popen() függvény végrehajtja a karakterlánc parancsa által adott parancsot. A függvénynek vissza kell adnia egy mutatót egy adatfolyamra, amelyet a cső olvasására vagy írására használnak, miközben csővezetéket hoz létre a hívó alkalmazás és a végrehajtott parancs között. A Popen funkció elérhető az I/O függvény szabványos könyvtárában, és létrehoz egy második folyamatot a terminálparancs futtatásához. A popen() nyitott fázisa megegyezik az fopen() függvény nyitott fázisával. A popen() függvény elágazással, egy cső létrehozásával és a shell végrehajtásával elindít egy folyamatot. Mivel a cső alapértelmezés szerint egyirányú; ennek eredményeként az adatfolyam vagy csak olvasható, vagy csak írható. A popen() függvény sikeres végrehajtása esetén egy nyílt adatfolyamot kapunk, amelyet a cső olvasására és írására használnak fel.

1. példa

A következő példaprogrammal a popen rendszerhívás segítségével beolvassuk az aktuális könyvtárban vagy mappában található fájlokat. Először is bevittük a C szabványkönyvtár stdio.h fejlécfájlját. Ezután van egy programunk int main()függvénye, ahol telepítettük a popen függvényt. Ezt megelőzően a „FILE” osztályból létrehoztuk a „FileOpen” mutatóváltozót. A fájl mutatóváltozója jelzi a következő bájtot, amelyet olvasni vagy írni kell.







Ezt követően hozzárendeltük a beolvasandó karakter határértékét. A „FileOpen” változó ezután a „popen” függvényt hívta meg. A „popen” függvény a Linux „ls -l” parancsát veszi át, amely felsorolja az aktuális könyvtár összes fájlját. Ezenkívül a popen függvénybe bevittük az „r” paramétert, amely az olvasási módot jelzi.



Itt a fájlok olvasási folyamatát a popen függvény használatával csőbe vezettük. Ezt követően feldolgoztuk a létrehozott csövet a while hurokkal. A while ciklus az fgets metódusokat használja, amelyek a „sor”, „sizeof the line” és „FileOpen” argumentumokat veszik fel. Az fget beolvassa a vezetékes folyamatot, és eltárolja a string „%s” szimbólumába. Ezt a szimbólumot a printf metóduson belül hívják a „vonal” argumentummal együtt. Miután elkészítettük a feldolgozott csővezetéket, a pclosed funkcióval, a csővezetékes folyamat lezárható az alábbi program végén.



#include


int fő ( )

{

FÁJL * FileOpen;

char vonal [ 130 ] ;


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

míg ( fgets ( sor, sor mérete, FileOpen ) )

{

printf ( '%s' , vonal ) ;

}

pclose ( Fájl megnyitása ) ;

}





A C program popen függvénye elágazta a fenti folyamatot, majd létrehozta a csövet. Most végrehajtottuk a shellben lévő folyam feldolgozott csövét a C fordítási paranccsal. A kimenet felsorolta az összes fájlt a „Home” könyvtárban, ahogy a programot ebben a könyvtárban végrehajtottuk.



2. példa

Az előző popen programban egyszerűen bemutattuk a popen program funkcionalitását, amelyet a fájlok olvasási folyamatának továbbítására használnak. Most vettünk egy másik példát a popen függvényre, ahol a folyamatot írási móddal vezettük be. Tekintsük a programot a fő funkcióval. A fájlmutató változót a fő függvényen belül „file” néven szerkesztettük meg. A fájlmutató a popen funkcióval kerül telepítésre.

A popen függvény a „cat” parancsot, az írási módhoz pedig a „w” parancsot veszi át. Itt minden File argumentumot szekvenciálisan beolvas és elküld a standard kimenetre a cat parancs. A for ciklus törzsében az fprintf függvényt használtuk a számértékek kinyomtatására, mivel megadtuk a „%d” szimbólumot. Ezután zárva, a popen pipe folyamat a pclose rendszerhívással.

#include


int fő ( int argc, char ** argv ) {

FÁJL * fájlt = popen ( 'macska' , 'ban ben' ) ;

int x = 0 ;


számára ( x = 0 ;x < 5 ;x++ ) {


fprintf ( fájlt , 'Számom = %d \n ' , x ) ;
}

pclose ( fájlt ) ;

Visszatérés 0 ;

}

Amikor végrehajtottuk a fent létrehozott folyamatot, a következő módon nyomtatta ki a számértékeket.

3. példa

Most van egy másik programunk, amely átviszi az egyik folyamat adatait egy másik folyamatba. Ezt a popen függvényből származó csővel fogjuk megtenni. A programot a C szabványos könyvtáraival valósítottuk meg. Ezután van egy int fő funkciónk a program telepítéséhez. Itt megadtuk a karakterláncot a sprintf függvényben a „puffer” argumentummal. Az sprintf() függvény az eredményt a sprintf által biztosított char pufferben tartja, ahelyett, hogy a promptba küldené.

Ezt követően a „read” változón belül meghívtuk a popen függvényt. Ott két folyamat van a popen függvényen belül. A „wc -c” az első folyamat, amely a megadott karakterek számlálására szolgál, a második folyamat pedig a „w”, amely azt jelzi, hogy a cső nyitva van írási módban. Ezt követően van az „fwrite” függvényünk, amely a pipe-t használja az adatok írásához. Az adatokat a „wc” fogadja, majd megszámolja a karaktert, és megjelenik a shellben.

#include

#include

#include

#include

int fő ( )

{

FÁJL * olvas ;

char puffer [ ötven ] ;

sprintf ( puffer, 'Linux rendszerhívás' ) ;

olvas =nyílik ( 'wc -c' , 'ban ben' ) ;

fwrite ( puffer, mérete ( char ) ,strlen ( puffer ) , olvas ) ;

pclose ( olvas ) ;

}

A promptban megjelenő karakterek „17”, mivel a fent megadott karakterlánc „17” karaktert tartalmaz. A „wc -c” folyamat beolvassa ezeket a karaktereket, és kimenetként nyomtatja ki.

4. példa

A popen fenti példája az adatokat egyik folyamatból a másikba küldi. Itt egy csövön keresztül kapjuk az adatokat az egyik folyamatból a másik folyamatba. A program fő feladata a puffer összeállítása, amely „50” értéket vesz fel. Ezután létrehoztuk az „r” változót, ahol a popen függvény hozta létre a folyamatot. Az „ls” folyamat a könyvtár fájljainak listázására szolgál, az „r” folyamat pedig az adatok kiolvasására a csőből. Az „ls” folyamat továbbítja az adatokat az „r” folyamatnak olvasni. Ezek után van a fread függvényünk, amely beolvassa az adatokat és a pufferben tárolja az adatokat. Ezután a print utasítás kinyomtatja a pufferben tárolt adatokat.

#include

#include

#include

#include

int fő ( )

{

FÁJL * r;

char puffer [ ötven ] ;


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

fead ( puffer, 1 , 25 , r ) ;


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

pclose ( r ) ;

}

Itt a meglévő fájlokból csak „50” karakter jelenik meg a munkakönyvtárból. Ezért a kimenet csak 50 karakterből áll.

Következtetés

Részletesen bemutattuk a Linux popen rendszerhívásait C nyelven. Négy példát implementáltunk, ahol a popen függvényt telepítettük. A popen függvény visszaadja a csőfolyamot az általunk hozzárendelt módnak megfelelően. A példákban az olvasási és írási módot is használtuk a fread és fwrite fájlkezelő függvényekkel. Első argumentumként a program nevét használtuk a popen() függvényben. A második argumentum egy „r” fájl olvasási módként vagy „w” írási módként.