C Programmation

Appel système dup2 en C

Appel système dup2 en C
le dup2() la fonction système est utilisée pour créer une copie d'un descripteur de fichier existant. Sous Linux, il existe 3 descripteurs de fichiers standard. Elles sont:

standard: Ceci est le descripteur de fichier d'entrée standard. Il est utilisé pour prendre l'entrée du terminal par défaut. scanf(), getc() etc fonctions utilise standard descripteur de fichier pour prendre les entrées de l'utilisateur. le standard le descripteur de fichier est également représenté par le nombre 0.

sortie standard: Ceci est le descripteur de fichier de sortie standard. Il est utilisé pour imprimer quelque chose sur la console/le terminal par défaut. Le très utilisé printf() la fonction utilise sortie standard pour imprimer la sortie souhaitée sur la console/le terminal. le sortie standard le descripteur de fichier est également représenté par le nombre 1.

stderr: Ceci est le descripteur de fichier d'erreur standard. Il fait la même chose que le sortie standard descripteur de fichier. le stderr le descripteur de fichier est utilisé pour imprimer les messages d'erreur sur la console/le terminal. La seule différence est si vous utilisez stderr descripteur de fichier pour imprimer les messages d'erreur, et sortie standard descripteur de fichier pour imprimer les sorties normales, vous pourrez ensuite les séparer. Par exemple, vous pouvez rediriger les messages d'erreur vers un fichier et les sorties normales vers la console ou un autre fichier. le stderr le descripteur de fichier est également représenté par le nombre 2.

Outre ces 3 descripteurs de fichiers, vous pouvez créer des descripteurs de fichiers supplémentaires en C. Pour créer un nouveau descripteur de fichier, vous pouvez utiliser le ouvert() fonction en C. le ouvert() La fonction ouvre un nouveau fichier, crée un descripteur de fichier pour ce fichier et attache un numéro autre que 0, 1, 2 au descripteur de fichier.

Une fois que vous ouvrez un fichier en utilisant ouvert() fonction, vous pouvez utiliser la lis() et écrivez() fonction pour lire et écrire dans le descripteur de fichier nouvellement créé.

Maintenant, imaginez une situation où vous voulez lire à partir d'un fichier spécifique en utilisant scanf() ou alors getc() fonction et écrire dans un autre fichier en utilisant printf() une fonction. Ce n'est pas le comportement par défaut du scanf(), getc() et printf() fonctionne comme je l'ai expliqué plus tôt. Par défaut, scanf() et getc() la fonction utilise standard et printf() les usages sortie standard et il n'y a aucun moyen de dire à ces fonctions d'utiliser d'autres descripteurs de fichiers. Donc, pour modifier ce comportement par défaut, vous devez remplacer le standard et sortie standard descripteurs de fichiers avec les descripteurs de fichiers souhaités. C'est ce que le dup2() la fonction système fait. le dup2() la fonction copie un descripteur de fichier dans un autre descripteur de fichier.

dup2() Syntaxe et valeur de retour :

La syntaxe de dup2() la fonction est :

int dup2(int old_file_descriptor, int new_file_descriptor);

dup2() la fonction copie le ancien_descripteur_fichier dans le new_file_descriptor. Si la new_file_descriptor existe déjà, alors il est automatiquement fermé, puis le ancien_descripteur_fichier y est copié.

En cas de succès, le dup2() la fonction renvoie le nouveau descripteur de fichier. Si une erreur se produit, dup2() Retour -1.

le dup2() la fonction est définie dans le fichier d'en-tête unistd.h.

Vous devez inclure l'en-tête unistd.h dans votre fichier source C afin d'utiliser le dup2() fonctionner comme suit :

#inclure

Pour plus d'informations, consultez la page de manuel de dup2() avec la commande suivante :

$ homme dup2

Exemple 1:

Créer un nouveau fichier source C 01_dup2.c et tapez les lignes de codes suivantes dans le fichier.

#inclure
#inclure
#inclure
#inclure
 
int main(void)
int nombre1, nombre2, somme ;
 
int input_fds = open("./contribution.txt", O_RDONLY);
 
if(dup2(input_fds, STDIN_FILENO) < 0)
printf("Impossible de dupliquer le descripteur de fichier.");
exit(EXIT_FAILURE);

 
scanf("%d %d", &nombre1, &nombre2);
 
somme = nombre1 + nombre2 ;
 
printf("%d + %d = %d\n", nombre1, nombre2, somme);
 
renvoie EXIT_SUCCESS ;

Maintenant, créez un nouveau fichier contribution.SMS dans le même répertoire et tapez la ligne suivante dedans.

15 41

L'objectif principal de ce programme est de lire 2 nombres entiers du contribution.SMS fichier utilisant scanf() fonction, ajoutez-les et imprimez la somme.

Tout d'abord, j'ai inclus les fichiers d'en-tête requis avec les lignes de codes suivantes.

#inclure
#inclure
#inclure
#inclure

Dans le principale() fonction, j'ai défini les variables requises.

int nombre1, nombre2, somme ;

Ensuite, j'ai ouvert le fichier contribution.SMS en lecture seule (O_RDONLY) en utilisant le ouvert() fonction et stocké le descripteur de fichier dans la variable input_fds.

int input_fds = open("./contribution.txt", O_RDONLY);

Une fois que j'ai le descripteur de fichier du contribution.SMS fichier, j'ai copié le descripteur de fichier dans le descripteur de fichier d'entrée standard STDIN_FILENO (0) en utilisant dup2() une fonction. Le descripteur de fichier de contribution.SMS est maintenant la valeur par défaut standard descripteur de fichier.

dup2(input_fds, STDIN_FILENO)

Je pourrais aussi écrire le dup2() fonctionner comme suit. Le résultat serait le même. STDIN_FILENO détient la valeur 0, quelle est la valeur du standard descripteur de fichier.

dup2(entrée_fds, 0)

j'ai aussi vérifié dup2() erreurs avec les lignes suivantes. Si une erreur se produit, le programme est configuré pour imprimer un message d'erreur et quitter.

if(dup2(input_fds, STDIN_FILENO) < 0)
printf("Impossible de dupliquer le descripteur de fichier.");
exit(EXIT_FAILURE);

Ensuite, j'ai utilisé scanf() pour scanner 2 numéros du contribution.SMS déposer.

scanf("%d %d", &nombre1, &nombre2);

Ensuite, j'ai ajouté les chiffres et imprimé la somme sur la console/terminal, la valeur par défaut sortie standard.

somme = nombre1 + nombre2 ;
printf("%d + %d = %d\n", nombre1, nombre2, somme);

Comme vous pouvez le voir, j'ai obtenu le résultat attendu une fois que j'ai exécuté le programme.

Exemple 2 :

Créer un nouveau fichier source C 02_dup2.c et tapez les lignes de codes suivantes dans le fichier.

#inclure
#inclure
#inclure
#inclure
#inclure
#inclure
int main(void)
int nombre1, nombre2, somme ;
int input_fds = open("./contribution.txt", O_RDONLY);
int output_fds = open("./production.txt", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
dup2(input_fds, STDIN_FILENO);
dup2(output_fds, STDOUT_FILENO);
scanf("%d %d", &nombre1, &nombre2);
somme = nombre1 + nombre2 ;
printf("%d + %d = %d\n", nombre1, nombre2, somme);
renvoie EXIT_SUCCESS ;

Maintenant, créez un nouveau fichier contribution.SMS dans le même répertoire et tapez la ligne suivante dedans.

15 41

Dans ce programme, j'ai fait la même chose que dans Exemple 1. La seule différence est que j'ai créé un nouveau fichier production.SMS et utilisé le descripteur de fichier de sortie.txt par défaut sortie standard descripteur de fichier utilisant le dup2() une fonction. Maintenant, toute la sortie du printf() la fonction sera écrite dans le production.SMS déposer.

J'ai créé un nouveau fichier et stocké le descripteur de fichier dans sortie_fds variable.

int output_fds = open("./production.txt", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);

J'ai également copié le descripteur de fichier output_fds dans le descripteur de fichier stdout. J'ai utilisé la constante prédéfinie STDOUT_FILENO.

dup2(output_fds, STDOUT_FILENO);

STDOUT_FILENO contient la valeur 1 (la valeur par défaut du descripteur de fichier de sortie standard). Donc, je pourrais réécrire l'appel de fonction dup2() comme suit. ça donnerait les mêmes résultats.

dup2(output_fds, 1);

Le reste du programme est le même. Comme vous pouvez le voir, une fois que j'ai exécuté le programme, il n'imprime rien sur la console/le terminal.

Mais, le programme a créé un nouveau fichier production.SMS déposer.

Comme vous pouvez le voir, la sortie est écrite dans le fichier production.SMS.

Si vous voulez écrire toutes les erreurs (stderr) dans un autre fichier, vous pouvez également copier un descripteur de fichier dans stderr descripteur de fichier comme suit.

dup2(error_fds, STDERR_FILENO);

Alors, c'est comme ça que vous utilisez le dup2() appel système en C. Merci d'avoir lu cet article.

Jeux HD remasterisés pour Linux qui n'ont jamais eu de version Linux plus tôt
De nombreux développeurs et éditeurs de jeux proposent une remasterisation HD d'anciens jeux pour prolonger la durée de vie de la franchise, veuillez ...
Comment utiliser AutoKey pour automatiser les jeux Linux
AutoKey est un utilitaire d'automatisation de bureau pour Linux et X11, programmé en Python 3, GTK et Qt. En utilisant ses fonctionnalités de script e...
Comment afficher le compteur FPS dans les jeux Linux
Les jeux Linux ont reçu une impulsion majeure lorsque Valve a annoncé la prise en charge de Linux pour le client Steam et leurs jeux en 2012. Depuis l...