' 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.
#includeint 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.