Précédent Remonter

3  Copie d'un descripteur de fichier

Les primitives
       #include <unistd.h>

       int dup(int oldfd) ;
       int dup2(int oldfd, int newfd) ;        
dupliquent un descripteur de fichier.

dup (oldfd) retourne un nouveau descripteur ; ce descripteur est le plus petit qui n'est pas utilisé par le processus. Le nouveau descripteur référence le même fichier que oldfd ; utilise le même pointeur de position et a le même mode d'accès (lecture, écriture...). dup() retourne -1 en cas d'erreur.

dup2(oldfd, newfd) duplique le descripteur odlfd. Le nouveau descripteur retourné est égal à newfd. Si newfd est utilisé, il est d'abord libéré comme avec close(). Le nouveau descripteur référence le même fichier que oldfd, utilise le même pointeur de position et a le même mode d'accès (lecture, écriture ...). dup2() retourne la valeur de newfd, -1 en cas d'erreur.

L'utilisation typique de ces primitives est de rediriger les entrées/sorties d'un processus. Par exemple, le programme suivant redirige l'entrée standard du processus depuis le fichier dont le nom est donné avant d'exécuter la commande wc.
% cat redirect.c
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int
main (int argc, char *argv[])
{
  int fd ;
  if (argc != 2) {
    fprintf (stderr, "Usage: %s fichier\n", argv[0]) ;
    exit (EXIT_FAILURE) ;
  }

  fd = open (argv[1], O_RDONLY) ;
  if (fd == -1) { perror ("open") ; exit (EXIT_FAILURE) ; }

  /* redirection de l'entree standard */
  if (dup2 (fd, 0) < 0) { perror ("dup2") ; exit (EXIT_FAILURE) ; }

  system ("wc") ;
  if (errno) { perror ("system") ; exit (EXIT_FAILURE) ; }

  exit (EXIT_SUCCESS) ; 
}
% ./redirect redirect.c 
        26      91      560

Exercice 6   Donnez un programme qui réalise l'équivalent de la commande Shell

% ls | wc 

Exercice 7   Donnez un programme qui réalise l'équivalent de la commande Shell

% ps axu | grep -v root | wc -l 

Exercice 8   Donnez un programme qui réalise l'équivalent de la commande Shell

        % (echo '#' ; cat ~/.cshrc ; echo '# eof') | sed '/$^/d'


Précédent Remonter