Systémové volání Linux Popen v C

Systemove Volani Linux Popen V C



Funkce popen() provede příkaz daný příkazem řetězce. Funkce by měla vracet ukazatel na proud, který se používá ke čtení nebo zápisu do kanálu a zároveň vytvořit kanál mezi volající aplikací a provedeným příkazem. Funkce Popen je dostupná ve standardní knihovně funkce I/O a vyvolá druhý proces pro spuštění příkazu terminálu. Otevřená fáze funkce popen() je stejná jako otevřená fáze funkce fopen(). Funkce popen() zahájí proces rozvětvením, vytvořením potrubí a spuštěním shellu. Protože potrubí je ve výchozím nastavení jednosměrné; v důsledku toho je proud buď pouze pro čtení, nebo pouze pro zápis. Při úspěšném provedení funkce popen() se získá otevřený proud, který se používá pro čtení a zápis z roury.

Příklad 1

Pomocí následujícího vzorového programu načteme soubory, které existují v aktuálním adresáři nebo složce, pomocí systémového volání popen. Nejprve jsme vložili hlavičkový soubor stdio.h standardní knihovny C. Pak máme program int main()funkci, kde jsme nasadili funkci popen. Předtím jsme vytvořili proměnnou ukazatele „FileOpen“ ze třídy „FILE“. Proměnná ukazatele souboru označuje následující bajt ke čtení nebo zápisu.







Poté jsme přiřadili limitní hodnotu znaku ke čtení. Proměnná „FileOpen“ pak vyvolala funkci „popen“. Funkce „popen“ přebírá příkaz „ls -l“ Linuxu, který zobrazí seznam všech souborů aktuálního adresáře. Navíc jsme do funkce popen zadali parametr „r“, který indikuje režim čtení.



Zde jsme zavedli proces čtení souborů pomocí funkce popen. Dále jsme vytvořenou rouru zpracovali smyčkou while. Cyklus while používá metody fgets, které přebírají argumenty „line“, „sizeof line“ a „FileOpen“. Fgety přečtou rourkovaný proces a uloží jej do symbolu „%s“ řetězce. Tento konkrétní symbol se volá uvnitř metody printf spolu s argumentem „line“. Jakmile vytvoříme zpracovanou rouru pomocí funkce plosed, lze rouru uzavřít tak, jak je nasazena na konci níže uvedeného programu.



#include


int main ( )

{

SOUBOR * FileOpen;

char line [ 130 ] ;


FileOpen = otevřít ( 'ls -l' , 'r' ) ;

zatímco ( fgets ( řádek, velikost řádku, FileOpen ) )

{

printf ( '%s' , řádek ) ;

}

zavřít ( FileOpen ) ;

}





Funkce popen programu C rozvětvila výše uvedený proces a poté vytvořila potrubí. Nyní jsme provedli zpracovanou rouru proudu v shellu příkazem C kompilace. Výstup obsahuje seznam všech souborů v adresáři „Home“, jak jsme v tomto adresáři spustili program.



Příklad 2

V předchozím programu popen máme jednoduchou ukázku funkčnosti programu popen, který se používá k propojení procesu streamování čtení souborů. Nyní jsme vzali další příklad funkce popen, kde jsme proces propojili s režimem zápisu. Podívejme se na program s hlavní funkcí. Zkonstruovali jsme proměnnou file pointer uvnitř hlavní funkce jako „file“. Ukazatel souboru je nasazen s funkcí popen.

Funkce popen přebírá příkaz „cat“ a „w“ pro režim zápisu. Zde je každý argument File postupně načten a odeslán na standardní výstup příkazem cat. V těle cyklu for jsme použili funkci fprintf k vytištění číselných hodnot počtu, protože jsme zadali symbol „%d“. Poté se proces popen pipe zavře se systémovým voláním pclose.

#include


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

SOUBOR * soubor = popen ( 'kočka' , 'v' ) ;

int x = 0 ;


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


fprintf ( soubor , 'Můj počet = %d.' \n ' , X ) ;
}

zavřít ( soubor ) ;

vrátit se 0 ;

}

Když jsme provedli výše vytvořený proces, vytiskl hodnoty počtu následujícím způsobem.

Příklad 3

Nyní máme další program, který přenáší data jednoho procesu do jiného procesu. Provedeme to dýmkou z funkce popen. Implementovali jsme program pomocí standardních knihoven C. Pak máme funkci int main pro nasazení programu. Zde jsme zadali řetězec ve funkci sprintf s argumentem „buffer“. Funkce sprintf() uchovává výsledek ve vyrovnávací paměti znaků, kterou poskytuje sprintf, místo aby jej posílal do výzvy.

Poté jsme zavolali funkci popen uvnitř proměnné „read“. Tam máme dva procesy uvnitř funkce popen. „wc -c“ je první proces, který se používá k počítání poskytnutých znaků, a druhý proces je „w“, což znamená, že roura je otevřená v režimu zápisu. Poté máme funkci „fwrite“, která používá roura k zápisu dat. Data budou přijata „wc“, poté spočítá znak a zobrazí se v shellu.

#include

#include

#include

#include

int main ( )

{

SOUBOR * číst ;

char buffer [ padesáti ] ;

sprintf ( vyrovnávací paměť, 'Systémové volání Linux' ) ;

číst = papež ( 'wc -c' , 'v' ) ;

fwrite ( buffer,velikost ( char ) ,strlen ( vyrovnávací paměť ) , číst ) ;

zavřít ( číst ) ;

}

Znaky zobrazené ve výzvě jsou „17“, protože řetězec, který jsme zadali výše, obsahuje „17“ znaků. Proces „wc -c“ načte tyto znaky a vytiskne je jako výstup.

Příklad 4

Výše uvedený příklad popen posílá data z jednoho procesu do druhého. Zde budeme přijímat data z jednoho procesu do druhého procesu prostřednictvím potrubí. Hlavní funkcí programu je sestrojit vyrovnávací paměť, která nabývá hodnot „50“. Poté jsme vytvořili proměnnou „r“, kde funkce popen vytvořila proces. Proces „ls“ se používá pro výpis souborů adresáře a proces „r“ pro čtení dat z roury. Proces „ls“ přenáší data do procesu „r“ ke čtení. Poté máme funkci fread, která čte data a ukládá data do vyrovnávací paměti. Poté příkaz print vytiskne data uložená ve vyrovnávací paměti.

#include

#include

#include

#include

int main ( )

{

SOUBOR * r;

char buffer [ padesáti ] ;


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

fred ( vyrovnávací paměť, 1 , 25 , r ) ;


printf ( '%s \n ' , vyrovnávací paměť ) ;

zavřít ( r ) ;

}

Zde se zobrazí pouze „50“ znaků existujících souborů z pracovního adresáře. Výstup tedy bude mít pouze 50 znaků.

Závěr

Poskytli jsme podrobnou ukázku volání systému Linux popen v jazyce C. Implementovali jsme čtyři příklady, kde jsme nasadili funkci popen. Funkce popen vrací proud potrubí podle režimu, který jsme přiřadili. V příkladech jsme použili režim čtení i zápisu s funkcemi pro práci se soubory fread a fwrite. Jako první argument jsme použili název programu ve funkci popen(). Druhým argumentem je soubor „r“ jako režim čtení nebo „w“ jako režim zápisu.