102 votes

dup2 / dup - pourquoi aurais-je besoin de dupliquer un descripteur de fichier ?

J'essaie de comprendre l'utilisation de l' dup2 et dup .

À partir de la page de man :

DESCRIPTION

dup and dup2 create a copy of the file descriptor oldfd.
After successful return of dup or dup2, the old and new descriptors may be used interchangeably. They share locks, file position pointers and flags; for example, if the file position is modified by using lseek on one of the descriptors, the position is also changed for the other.

The two descriptors do not share the close-on-exec flag, however.

dup uses the lowest-numbered unused descriptor for the new descriptor.

dup2 makes newfd be the copy of oldfd, closing newfd first if necessary.  

RETURN VALUE

dup and dup2 return the new descriptor, or -1 if an error occurred (in which case, errno is set appropriately).  

Pourquoi aurais-je besoin que l'appel système ? qu'est-ce que l'utilisation de dupliquer le descripteur de fichier ?

Si j'ai le descripteur de fichier , pourquoi voudrais-je à en faire une copie ?

J'apprécierais si vous pouviez expliquer et me donner un exemple où l' dup2 / dup est nécessaire .

Merci

52voto

Deepthought Points 954

La dup de l'appel système à dupliquer un descripteur existant, de retour d'un nouveau se réfère à la même sous-jacent I/O de l'objet.

Dup permet de coquilles de mettre en œuvre des commandes comme ceci:

ls existing-file non-existing-file > tmp1  2>&1

Le 2>&1 indique au shell pour donner la commande d'un descripteur de fichier 2 qui est une copie du descripteur de 1.
Maintenant l'erreur si nous avons essayé de faire ls de fichier non-existant et juridique de la sortie de ls sur les fichiers existants apparaissent dans temp1 fichier.

L'exemple de code suivant exécute le programme avec wc, entrée standard connecté à la fin de lecture d'un tuyau.

int p[2];
char *argv[2];
argv[0] = "wc";
argv[1] = 0;
pipe(p);
if(fork() == 0) {
    close(STDIN); //CHILD CLOSING stdin
    dup(p[STDIN]); // copies the fd of read end of pipe into its fd i.e 0 (STDIN)
    close(p[STDIN]);
    close(p[STDOUT]);
    exec("/bin/wc", argv);
} else {
    write(p[STDOUT], "hello world\n", 12);
    close(p[STDIN]);
    close(p[STDOUT]);
}

L'enfant de dup la lire sur le descripteur de fichier 0, ferme le fichier de scriptors dans p, et chefs wc. Lorsque wc lit sur son entrée standard, il lit à partir de la la pipe.
C'est de cette façon que les tuyaux sont mis en œuvre à l'aide de dup, bien qu'une utilisation de dup maintenant, vous utilisez le tuyau pour construire quelque chose d'autre, c'est la beauté des appels système,vous construisez une chose après l'autre à l'aide des outils qui sont déjà là , ces outil ont été successivement construits à l'aide de quelque chose d'autre, etc .. À la fin des appels système sont les outils les plus simples que vous obtenez dans le noyau

Cheers :)

20voto

R.. Points 93718

Une autre raison pour dupliquer un descripteur de fichier est de l'utiliser avec fdopen. fclose ferme le descripteur de fichier qui a été transmis fdopen, donc si vous ne voulez pas le fichier d'origine descripteur d'être fermé, il vous faut le dupliquer avec dup première.

4voto

Tanmoy Points 689

Certains points liés à la dup/dup2 peut être noté merci

dup/dup2 - Techniquement, le but est de partager un Fichier d'Entrée de la table à l'intérieur d'un seul processus par différentes poignées. ( Si nous sommes bifurquer le descripteur de fichier est dupliqué par défaut dans le processus de l'enfant et le fichier d'entrée de la table est également partagée).

Cela signifie que nous pouvons avoir plus d'un descripteur de fichier et d'avoir éventuellement des attributs différents pour un seul d'ouvrir le fichier d'entrée de la table à l'aide de dup/fonction dup2.

(Mais semble actuellement seulement FD_CLOEXEC drapeau est le seul attribut pour un descripteur de fichier).

http://www.gnu.org/software/libc/manual/html_node/Descriptor-Flags.html

dup(fd) is equivalent to fcntl(fd, F_DUPFD, 0);

dup2(fildes, fildes2); is equivalent to 

   close(fildes2);
   fcntl(fildes, F_DUPFD, fildes2);

Les différences sont (pour la dernière)- en dehors de quelques errno valeur beteen dup2 et fcntl près suivie par fcntl peut soulever des conditions de course depuis deux appels de fonction sont impliqués.

Les détails peuvent être vérifiés http://pubs.opengroup.org/onlinepubs/009695399/functions/dup.html

Un Exemple d'utilisation -

Un exemple intéressant tout en mettant en œuvre le contrôle du travail dans un shell, où l'utilisation de la dup/dup2 peut être vu ..dans le lien ci-dessous

http://www.gnu.org/software/libc/manual/html_node/Launching-Jobs.html#Launching-Jobs

4voto

alinsoar Points 3583

dup est utilisé pour être en mesure de rediriger la sortie d'un processus.

Par exemple, si vous souhaitez enregistrer la sortie d'un processus, vous dupliquez la sortie (fd=1), vous rediriger la copie de l'fd vers un fichier, puis de la fourche et exécuter le processus, et lorsque le processus est terminé, vous rediriger à nouveau enregistrées fd à la sortie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X