Appel système Linux Popen en C

Appel Systeme Linux Popen En C



' La fonction popen() exécutera la commande donnée par la commande de la chaîne. La fonction doit renvoyer un pointeur vers un flux utilisé pour lire ou écrire dans le tube tout en créant un tube entre l'application appelante et la commande exécutée. La fonction Popen est disponible dans la bibliothèque standard de la fonction I/O et génère un deuxième processus pour exécuter une commande de terminal. La phase d'ouverture de popen() est la même que la phase d'ouverture de la fonction fopen(). La fonction popen() lance un processus en bifurquant, en construisant un tube et en exécutant le shell. Puisqu'un tuyau est unidirectionnel par défaut ; par conséquent, le flux est soit en lecture seule, soit en écriture seule. Lors de l'exécution réussie de la fonction popen(), un flux ouvert est obtenu qui est utilisé pour que le tube puisse lire et écrire.

Exemple 1

Avec l'exemple de programme suivant, nous lirons les fichiers qui existent dans le répertoire ou le dossier en cours en utilisant l'appel système popen. Tout d'abord, nous avons entré le fichier d'en-tête stdio.h de la bibliothèque standard C. Ensuite, nous avons une fonction int main() du programme où nous avons déployé la fonction popen. Avant cela, nous avons établi la variable de pointeur 'FileOpen' à partir de la classe 'FILE'. La variable de pointeur du fichier indique l'octet suivant à lire ou à écrire.







Après cela, nous avons attribué la valeur limite du caractère à lire. La variable « FileOpen » a alors appelé la fonction « popen ». La fonction « popen » prend la commande « ls -l » de Linux, qui va lister tous les fichiers du répertoire courant. De plus, nous avons entré le paramètre 'r' dans la fonction popen, qui indique le mode de lecture.



Ici, nous avons canalisé le processus de lecture des fichiers en utilisant la fonction popen. Ensuite, nous avons traité le tube créé avec la boucle while. La boucle while utilise les méthodes fgets, qui prennent les arguments « line », « sizeof the line » et « FileOpen ». Les fgets lisent le processus canalisé et le stockent dans le symbole '%s' de la chaîne. Ce symbole particulier est appelé dans la méthode printf avec l'argument 'ligne'. Une fois que nous avons créé le canal traité, avec la fonction pclosed, le processus canalisé peut être fermé tel que déployé à la fin du programme ci-dessous.



#include


int main ( )

{

DOSSIER * FichierOuvrir ;

ligne de char [ 130 ] ;


FichierOuvrir = ouvrir ( 'ls -l' , 'r' ) ;

tandis que ( fgets ( ligne, taille de ligne, FichierOuvrir ) )

{

printf ( '%s' , ligne ) ;

}

fermer ( FichierOuvrir ) ;

}





La fonction popen du programme C a dérivé le processus ci-dessus, puis a créé le tube. Maintenant, nous avons exécuté le tube traité du flux dans le shell avec la commande de compilation C. La sortie a répertorié tous les fichiers dans le répertoire 'Home' car nous avons exécuté le programme dans ce répertoire.



Exemple 2

Dans le programme popen précédent, nous avons une démonstration simple de la fonctionnalité du programme popen qui est utilisé pour canaliser le processus de lecture en continu des fichiers. Maintenant, nous avons pris un autre exemple de la fonction popen où nous avons canalisé le processus avec le mode écriture. Considérons le programme avec la fonction principale. Nous avons construit la variable de pointeur de fichier à l'intérieur de la fonction principale en tant que 'fichier'. Le pointeur de fichier est déployé avec la fonction popen.

La fonction popen prend la commande 'cat' et le 'w' pour le mode écriture. Ici, chaque argument File est séquentiellement lu et envoyé à la sortie standard par la commande cat. Dans le corps de la boucle for, nous avons utilisé la fonction fprintf pour imprimer les valeurs de comptage numériques car nous avons spécifié le symbole '% d'. Puis fermé, le processus popen pipe avec l'appel système pclose.

#include


int main ( int argc, caractère ** argv ) {

DOSSIER * dossier = ouvrir ( 'chat' , 'dans' ) ;

entier x = 0 ;


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


fprintf ( dossier , 'Mon compte = %d \n ' , X ) ;
}

fermer ( dossier ) ;

revenir 0 ;

}

Lorsque nous avons exécuté le processus créé ci-dessus, il a imprimé les valeurs de comptage de la manière suivante.

Exemple 3

Maintenant, nous avons un autre programme qui transfère les données d'un processus à un autre processus. Nous allons le faire avec le tube de la fonction popen. Nous avons implémenté le programme en utilisant les bibliothèques standard du C. Ensuite, nous avons une fonction int main pour déployer un programme. Ici, nous avons spécifié la chaîne dans la fonction sprintf avec l'argument 'buffer'. La fonction sprintf() conserve le résultat sur le tampon char fourni par sprintf plutôt que de l'envoyer à l'invite.

Après cela, nous avons appelé la fonction popen à l'intérieur de la variable 'read'. Là, nous avons deux processus à l'intérieur de la fonction popen. Le 'wc -c' est le premier processus utilisé pour compter les caractères fournis, et le second processus est le 'w', qui indique que le tube est ouvert en mode écriture. Après cela, nous avons la fonction 'fwrite' qui utilise le tube pour écrire des données. Les données seront reçues par le 'wc', puis comptées le caractère et affichées dans le shell.

#include

#include

#include

#include

int main ( )

{

DOSSIER * lis ;

tampon de caractères [ cinquante ] ;

sprintf ( amortir, 'Appel système Linux' ) ;

lis =ouvrir ( 'wc-c' , 'dans' ) ;

fécrire ( tampon,taillede ( carboniser ) ,strlen ( amortir ) , lis ) ;

fermer ( lis ) ;

}

Les caractères affichés dans l'invite sont '17' car la chaîne que nous avons spécifiée ci-dessus contient '17' caractères. Le processus 'wc -c' lit ces caractères et les imprime en sortie.

Exemple 4

L'exemple ci-dessus de popen envoie les données d'un processus à un autre. Ici, nous allons recevoir les données d'un processus à l'autre processus via un tuyau. La fonction principale du programme est de construire le tampon, qui prend des valeurs '50'. Ensuite, nous avons créé la variable 'r', où la fonction popen a créé le processus. Le processus 'ls' est utilisé pour lister les fichiers du répertoire, et le processus 'r' pour lire les données du tube. Le processus 'ls' transmet les données au processus 'r' pour lecture. Après cela, nous avons la fonction fread, qui lit les données et les stocke dans le tampon. Ensuite, l'instruction d'impression imprimera les données stockées dans le tampon.

#include

#include

#include

#include

int main ( )

{

DOSSIER * r;

tampon de caractères [ cinquante ] ;


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

peur ( amortir, 1 , 25 , r ) ;


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

fermer ( r ) ;

}

Ici, seuls « 50 » caractères des fichiers existants sont affichés à partir du répertoire de travail. Par conséquent, la sortie n'aura que 50 caractères.

Conclusion

Nous avons fait une démonstration détaillée des appels système Linux popen en langage C. Nous avons implémenté quatre exemples où nous avons déployé la fonction popen. La fonction popen renvoie le flux du tuyau en fonction du mode que nous avons attribué. Dans les exemples, nous avons utilisé à la fois le mode lecture et écriture avec les fonctions de gestion de fichiers fread et fwrite. Nous avons utilisé le nom du programme dans la fonction popen() comme premier argument. Le second argument est un fichier « r » en mode lecture ou « w » en mode écriture.