Crida al sistema Linux Popen en C

Crida Al Sistema Linux Popen En C



La funció popen() durà a terme l'ordre donada per l'ordre de la cadena. La funció hauria de retornar un punter a un flux que s'utilitza per llegir o escriure a la canalització alhora que crea una canalització entre l'aplicació que crida i l'ordre executada. La funció Popen està disponible a la biblioteca estàndard de la funció d'E/S i genera un segon procés per executar una ordre del terminal. La fase oberta del popen() és la mateixa que la fase oberta de la funció fopen(). La funció popen() inicia un procés bifurcant, construint una canonada i executant el shell. Com que una canonada és unidireccional per defecte; com a resultat, el flux és de només lectura o només d'escriptura. Quan la funció popen() s'executa correctament, s'obté un flux obert que s'utilitza perquè la canalització pugui llegir i escriure.

Exemple 1

Amb el programa d'exemple següent, llegirem els fitxers que hi ha al directori o carpeta actual mitjançant la crida del sistema popen. En primer lloc, hem introduït el fitxer de capçalera stdio.h de la biblioteca estàndard C. Aleshores, tenim un programa int main()function on hem desplegat la funció popen. Abans d'això, vam establir la variable punter 'FileOpen' de la classe 'FILE'. La variable punter del fitxer indica el byte següent per llegir o escriure.







Després d'això, vam assignar el valor límit del caràcter per llegir. Aleshores, la variable 'FileOpen' va invocar la funció 'open'. La funció 'open' pren l'ordre 'ls -l' de Linux, que enumerarà tots els fitxers del directori actual. A més, hem introduït el paràmetre 'r' a la funció popen, que indica el mode de lectura.



Aquí, hem canalitzat el procés de lectura de fitxers mitjançant la funció popen. A continuació, vam processar la canonada creada amb el bucle while. El bucle while utilitza els mètodes fgets, que prenen els arguments 'line', 'sizeof the line' i 'FileOpen'. Els fgets van llegir el procés canalitzat i el van emmagatzemar al símbol '%s' de cadena. Aquest símbol en particular s'anomena dins del mètode printf juntament amb l'argument 'línia'. Un cop hem creat la canonada processada, amb la funció pclosed, el procés canalitzat es pot tancar tal com s'ha desplegat al final del programa següent.



#inclou


int principal ( )

{

DOSSIER * FitxerObre;

línia de carbó [ 130 ] ;


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

mentre ( fgets ( line, sizeof line, FileOpen ) )

{

imprimirf ( '%s' , línia ) ;

}

ptancar ( FitxerObre ) ;

}





La funció popen del programa C va bifurcar el procés anterior i després va crear la canonada. Ara, hem executat la canonada processada del flux a l'intèrpret d'ordres amb l'ordre de compilació C. La sortida ha llistat tots els fitxers del directori 'Inici' mentre hem executat el programa en aquest directori.



Exemple 2

Al programa popen anterior, tenim una demostració senzilla de la funcionalitat del programa popen que s'utilitza per canalitzar el procés de reproducció de fitxers de lectura. Ara, hem pres un altre exemple de la funció popen on hem canalitzat el procés amb el mode d'escriptura. Considerem el programa amb la funció principal. Hem construït la variable punter de fitxer dins de la funció principal com a 'fitxer'. El punter de fitxer es desplega amb la funció popen.

La funció popen pren l'ordre 'cat' i la 'w' per al mode d'escriptura. Aquí, cada argument de fitxer es llegeix seqüencialment i s'envia a la sortida estàndard mitjançant l'ordre cat. Al cos del bucle for, hem utilitzat la funció fprintf per imprimir els valors de recompte numèrics tal com hem especificat el símbol '%d'. A continuació, tancat, el procés de popen pipe amb la crida al sistema pclose.

#inclou


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

DOSSIER * dossier = popen ( 'gat' , 'en' ) ;

int x = 0 ;


per ( x = 0 ;x < 5 ;x++ ) {


fprintf ( dossier , 'El meu recompte = %d \n ' , x ) ;
}

ptancar ( dossier ) ;

tornar 0 ;

}

Quan vam executar el procés creat anteriorment, va imprimir els valors del recompte de la manera següent.

Exemple 3

Ara, tenim un altre programa que transfereix les dades d'un procés a un altre procés. Ho farem amb la canonada de la funció popen. Hem implementat el programa utilitzant les biblioteques estàndard de C. Aleshores, tenim una funció int main per desplegar un programa. Aquí, hem especificat la cadena a la funció sprintf amb l'argument 'buffer'. La funció sprintf() manté el resultat a la memòria intermèdia de caràcters proporcionada per sprintf en lloc d'enviar-lo a l'indicador.

Després d'això, vam cridar la funció popen dins de la variable 'llegir'. Allà, tenim dos processos dins de la funció popen. El 'wc -c' és el primer procés que s'utilitza per comptar els caràcters proporcionats, i el segon procés és el 'w', que indica que la canonada està oberta en mode d'escriptura. Després d'això, tenim la funció 'fwrite' que utilitza la canonada per escriure dades. El 'wc' rebrà les dades, després es comptarà el caràcter i es mostrarà al shell.

#include

#include

#include

#include

int principal ( )

{

DOSSIER * llegir ;

buffer de caràcters [ 50 ] ;

sprintf ( buffer, 'Trucada del sistema Linux' ) ;

llegir = obrir ( 'wc -c' , 'en' ) ;

f escriure ( buffer, sizeof ( char ) ,strlen ( tampó ) , llegir ) ;

ptancar ( llegir ) ;

}

Els caràcters que es mostren a la sol·licitud són '17' perquè la cadena que hem especificat anteriorment conté '17' caràcters. El procés 'wc -c' llegeix aquests caràcters i els imprimeix com a sortida.

Exemple 4

L'exemple anterior de popen envia les dades d'un procés a un altre. Aquí, rebrem les dades d'un procés a l'altre mitjançant una canonada. La funció principal del programa és construir el buffer, que pren valors '50'. A continuació, vam crear la variable 'r', on la funció popen va crear el procés. El procés 'ls' s'utilitza per llistar els fitxers del directori i el procés 'r' per llegir les dades de la canonada. El procés 'ls' transmet les dades al procés 'r' per llegir-les. Després d'això, tenim la funció fread, que llegeix les dades i les emmagatzema a la memòria intermèdia. Aleshores, la declaració d'impressió imprimirà les dades emmagatzemades a la memòria intermèdia.

#include

#include

#include

#include

int principal ( )

{

DOSSIER * r;

buffer de caràcters [ 50 ] ;


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

fread ( buffer, 1 , 25 , r ) ;


imprimirf ( '%s \n ' , amortidor ) ;

ptancar ( r ) ;

}

Aquí només es mostren '50' caràcters dels fitxers existents del directori de treball. Per tant, la sortida només tindrà 50 caràcters.

Conclusió

Hem fet una demostració detallada de les crides al sistema Linux popen en llenguatge C. Hem implementat quatre exemples on hem desplegat la funció popen. La funció popen retorna el flux de canonada segons el mode que hem assignat. En els exemples, hem utilitzat tant el mode de lectura com d'escriptura amb les funcions de gestió de fitxers fread i fwrite. Hem utilitzat el nom del programa a la funció popen() com a primer argument. El segon argument és un fitxer 'r' com a lectura o 'w' com a mode d'escriptura.