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'