Appel du système DUP2 dans C

Appel du système DUP2 dans C
Le dup2 () La fonction système est utilisée pour créer une copie d'un descripteur de fichiers existant. Dans Linux, il y a 3 descripteurs de fichiers standard. Ils sont:

stdin: Ceci est le descripteur de fichier d'entrée standard. Il est utilisé pour prendre les commentaires du terminal par défaut. scanf (), getc () ETC Fonctions Use stdin Descripteur de fichiers pour prendre les entrées utilisateur. Le stdin Le descripteur de fichiers est également représenté par le numéro 0.

stdout: Ceci est le descripteur de fichiers de sortie standard. Il est utilisé pour imprimer quelque chose à la console / terminal par défaut. Le largement utilisé printf () Utilisations de la fonction stdout Pour imprimer la sortie souhaitée à la console / terminal. Le stdout Le descripteur de fichiers est également représenté par le numéro 1.

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

Autre que ces 3 descripteurs de fichiers, vous pouvez créer des descripteurs de fichiers supplémentaires en C. Pour créer un nouveau descripteur de fichiers, vous pouvez utiliser le ouvrir() fonction en c. Le ouvrir() La fonction ouvre un nouveau fichier, crée un descripteur de fichiers pour ce fichier et joint un nombre autre que 0, 1, 2 au descripteur de fichier.

Une fois que vous avez ouvert un fichier en utilisant ouvrir() fonction, vous pouvez utiliser le lire() et écrire() fonction à lire et à écrire dans le descripteur de fichiers nouvellement créé.

Maintenant, imaginez une situation où vous souhaitez lire à partir d'un fichier spécifique en utilisant scanf () ou getc () fonction et écrivez dans un autre fichier en utilisant printf () fonction. Ce n'est pas le comportement par défaut du scanf (), getc () et printf () Fonctions comme je l'ai expliqué plus tôt. Par défaut, scanf () et getc () Utilisations de la fonction stdin et printf () les usages stdout 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 stdin et stdout Descripteurs de fichiers avec les descripteurs de fichiers souhaités. C'est ce que le dup2 () La fonction du système fait. Le dup2 () 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 () Fonction copie le old_file_descriptor dans le new_file_descriptor. Si la new_file_descriptor existe déjà, puis il est automatiquement fermé, puis le old_file_descriptor est copié dessus.

Sur le 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 () fonction comme suit:

#inclure

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

$ man dup2

Exemple 1:

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

#inclure
#inclure
#inclure
#inclure
int main (void)
int numéro1, numéro2, sum;
int input_fds = open ("./saisir.txt ", o_rdonly);
if (dup2 (input_fds, stdin_fileno) < 0)
printf ("Impossible de dupliquer le descripteur de fichiers.");
exit (exit_failure);

scanf ("% d% d", & nomber1, & nombre2);
sum = nombre1 + nombre2;
printf ("% d +% d =% d \ n", nombre1, nombre2, sum);
return exit_success;

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

15 41

L'objectif principal de ce programme est de lire 2 numéros entiers saisir.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 principal() fonction, j'ai défini les variables requises.

int numéro1, numéro2, sum;

Ensuite, j'ai ouvert le fichier saisir.SMS En mode lecture uniquement (O_rdonly) en utilisant le ouvrir() fonction et stocké le descripteur de fichier dans la variable input_fds.

int input_fds = open ("./saisir.txt ", o_rdonly);

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

dup2 (input_fds, stdin_fileno)

Je pourrais aussi écrire le dup2 () fonction comme suit. Le résultat serait le même. Stdin_fileno détient la valeur 0, qui est la valeur du stdin descripteur de fichiers.

dup2 (input_fds, 0)

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

if (dup2 (input_fds, stdin_fileno) < 0)
printf ("Impossible de dupliquer le descripteur de fichiers.");
exit (exit_failure);

Ensuite, j'ai utilisé scanf () Pour scanner 2 nombres à partir du saisir.SMS déposer.

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

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

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

Comme vous pouvez le voir, j'ai obtenu la sortie attendue une fois que j'ai exécuté le programme.

Exemple 2:

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

#inclure
#inclure
#inclure
#inclure
#inclure
#inclure
int main (void)
int numéro1, numéro2, sum;
int input_fds = open ("./saisir.txt ", o_rdonly);
int output_fds = open ("./sortir.txt ", o_wronly | o_creat, s_irusr | s_iwusr);
dup2 (input_fds, stdin_fileno);
dup2 (output_fds, stdout_fileno);
scanf ("% d% d", & nomber1, & nombre2);
sum = nombre1 + nombre2;
printf ("% d +% d =% d \ n", nombre1, nombre2, sum);
return exit_success;

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

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 sortir.SMS et utilisé le descripteur de fichier de la sortie.txt comme par défaut stdout Descripteur de fichiers à l'aide du dup2 () fonction. Maintenant, toute la sortie du printf () La fonction sera écrite au sortir.SMS déposer.

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

int output_fds = open ("./sortir.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 du descripteur de fichier par défaut de stdout). Donc, je pouvais réécrire dup2 () l'appel de fonction comme suit. Cela 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 / terminal.

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

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

Si vous souhaitez écrire toutes les erreurs (stderr) À un autre fichier, vous pouvez également copier un descripteur de fichiers pour stderr Descripteur de fichiers comme suit.

dup2 (error_fds, stderr_fileno);

Alors, c'est ainsi que vous utilisez le dup2 () Appel du système dans C. Merci d'avoir lu cet article.