Apel de sistem Linux Popen în C

Apel De Sistem Linux Popen In C



Funcția popen() va executa comanda dată de comanda șirului. Funcția ar trebui să returneze un pointer către un flux care este folosit pentru a citi sau scrie în conductă, creând, de asemenea, o conductă între aplicația care apelează și comanda executată. Funcția Popen este disponibilă în biblioteca standard a funcției I/O și generează un al doilea proces pentru a rula o comandă de terminal. Faza deschisă a popen() este aceeași cu faza deschisă din funcția fopen(). Funcția popen() inițiază un proces prin bifurcare, construirea unei conducte și executarea shell-ului. Deoarece o conductă este unidirecțională în mod implicit; ca urmare, fluxul este fie doar pentru citire, fie doar pentru scriere. La executarea cu succes a funcției popen(), se obține un flux deschis care este folosit pentru ca pipe să citească și să scrie.”

Exemplul 1

Cu următorul exemplu de program, vom citi fișierele care există în directorul sau folderul curent folosind apelul de sistem popen. În primul rând, am introdus fișierul antet stdio.h al bibliotecii standard C. Apoi, avem un program int main()funcție unde am implementat funcția popen. Înainte de aceasta, am stabilit variabila pointer „FileOpen” din clasa „FILE”. Variabila pointer a fișierului indică octetul care urmează să citească sau să scrie.







După aceea, am atribuit valoarea limită a caracterului pentru a fi citit. Variabila „FileOpen” a invocat apoi funcția „popen”. Funcția „popen” preia comanda „ls -l” a Linux, care va lista toate fișierele din directorul curent. Mai mult, am introdus parametrul „r” în funcția popen, care indică modul de citire.



Aici, am canalizat procesul de citire a fișierelor utilizând funcția popen. Apoi, am procesat conducta creată cu bucla while. Bucla while folosește metodele fgets, care preia argumentele „line”, „sizeof the line” și „FileOpen”. Fget-urile au citit procesul canalizat și l-au stocat în simbolul „%s” al șirului. Acest simbol special este numit în cadrul metodei printf împreună cu argumentul „linie”. Odată ce am creat conducta procesată, cu funcția pclosed, procesul piperat poate fi închis așa cum este implementat la sfârșitul programului de mai jos.



#include


int principal ( )

{

FIŞIER * FileOpen;

linia char [ 130 ] ;


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

in timp ce ( fgets ( linie, dimensiunea liniei, FileOpen ) )

{

printf ( „%s” , linie ) ;

}

pclose ( FileOpen ) ;

}





Funcția popen a programului C a bifurcat procesul de mai sus și apoi a creat conducta. Acum, am executat conducta procesată a fluxului în shell cu comanda de compilare C. Ieșirea a enumerat toate fișierele din directorul „Acasă”, deoarece am executat programul în acel director.



Exemplul 2

În programul popen anterior, avem o demonstrație simplă a funcționalității programului popen care este utilizat pentru canalizarea procesului de streaming de citire a fișierelor. Acum, am luat un alt exemplu de funcție popen în care am conectat procesul cu modul de scriere. Să luăm în considerare programul cu funcția principală. Am construit variabila indicator de fișier în interiorul funcției principale ca „fișier”. Pointerul de fișier este implementat cu funcția popen.

Funcția popen preia comanda „cat” și „w” pentru modul de scriere. Aici, fiecare argument File este citit secvențial și trimis la ieșirea standard de către comanda cat. În corpul buclei for, am folosit funcția fprintf pentru a imprima valorile numerice de numărare, așa cum am specificat simbolul „%d”. Apoi închis, procesul popen pipe cu apelul de sistem pclose.

#include


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

FIŞIER * fişier = popen ( 'pisică' , 'în' ) ;

int x = 0 ;


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


fprintf ( fişier , „Numărul meu = %d \n ' , X ) ;
}

pclose ( fişier ) ;

întoarcere 0 ;

}

Când am executat procesul creat mai sus, a tipărit valorile numărului în felul următor.

Exemplul 3

Acum, avem un alt program care transferă datele unui proces într-un alt proces. Vom face acest lucru cu conducta din funcția popen. Am implementat programul folosind bibliotecile standard ale lui C. Apoi, avem o funcție int main pentru implementarea unui program. Aici, am specificat șirul în funcția sprintf cu argumentul „buffer”. Funcția sprintf() păstrează rezultatul în tamponul de caractere furnizat de sprintf, mai degrabă decât să îl trimită la prompt.

După aceea, am numit funcția popen în interiorul variabilei „citește”. Acolo, avem două procese în interiorul funcției popen. „wc -c” este primul proces care este folosit pentru a număra caracterele furnizate, iar al doilea proces este „w”, care indică faptul că conducta este deschisă în modul de scriere. După aceea, avem funcția „fwrite” care folosește conducta pentru a scrie date. Datele vor fi primite de „wc”, apoi vor fi numărate caracterul și afișate în shell.

#include

#include

#include

#include

int principal ( )

{

FIŞIER * citit ;

tampon de tip char [ cincizeci ] ;

sprintf ( tampon, „Apel de sistem Linux” ) ;

citit =popen ( 'wc -c' , 'în' ) ;

fscrie ( tampon, dimensiunea ( char ) ,strlen ( tampon ) , citit ) ;

pclose ( citit ) ;

}

Caracterele afișate în prompt sunt „17” deoarece șirul pe care l-am specificat mai sus conține „17” caractere. Procesul „wc -c” citește aceste caractere și le imprimă ca rezultat.

Exemplul 4

Exemplul de mai sus de popen trimite datele de la un proces la altul. Aici, vom primi datele de la un proces la altul printr-o conductă. Funcția principală a programului este de a construi tamponul, care ia valori „50”. Apoi, am creat variabila „r”, unde funcția popen a creat procesul. Procesul „ls” este folosit pentru a lista fișierele directorului, iar procesul „r” pentru citirea datelor din conductă. Procesul „ls” transmite datele către procesul „r” pentru a le citi. După aceasta, avem funcția fread, care citește datele și stochează datele în buffer. Apoi, instrucțiunea print va tipări datele stocate în buffer.

#include

#include

#include

#include

int principal ( )

{

FIŞIER * r;

tampon de tip char [ cincizeci ] ;


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

friad ( tampon, 1 , 25 , r ) ;


printf ( „%s \n ' , tampon ) ;

pclose ( r ) ;

}

Aici sunt afișate doar „50” caractere ale fișierelor existente din directorul de lucru. Prin urmare, rezultatul va avea doar 50 de caractere.

Concluzie

Am oferit o demonstrație detaliată a apelurilor de sistem Linux popen în limbajul C. Am implementat patru exemple în care am implementat funcția popen. Funcția popen returnează fluxul conductei conform modului pe care l-am alocat. În exemple, am folosit atât modul de citire, cât și modul de scriere cu funcțiile de gestionare a fișierelor fread și fwrite. Am folosit numele programului în funcția popen() ca prim argument. Al doilea argument este un fișier „r” ca citire sau „w” ca mod de scriere.