1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <assert.h>
int main(int argc,char *argv[])
{
int max_open = 3; // 0 (stdin), 1 (stdout) et 2 (stderr) deja ouverts
int i;
char chaine[128];
// je duplique la sortie standard autant de fois que possible
// (valeur dépendant de l'OS mais qui peut parfois (toujours ?) etre modifiee)
while (dup2(1,max_open) == max_open)
max_open++;
fprintf(stderr,"%s\n",strerror(errno));
fprintf(stderr,"max %d fichiers ouverts simultanement\n",max_open);
// ecriture sur tous les nouveaux fichiers ouverts/crees via dup2
// (pour montrer que ca part bien sur la sortie standard)
for (i=3;i<max_open;i++)
{
write(1,"stdout: ",8);
sprintf(chaine,"chaine ecrite sur fd %d\n",i);
write(i,chaine,strlen(chaine));
}
// fermeture de tous les fichiers dup2liques avec verif
for (i=3;i<max_open;i++)
assert(close(i) == 0);
// re-tentative d'ecriture sur fd 3
strcpy(chaine,"ne devrait jamais s'afficher");
if (write(3,chaine,strlen(chaine)) == -1)
fprintf(stderr,"l'ecriture a normalement echoue : %s\n",strerror(errno));
// des ecritures "classiques" sur stdout / 1 fonctionnent toujours
strcpy(chaine,"ecriture chaine sur fd 1\n");
write(1,chaine,strlen(chaine));
fprintf(stdout,"ca marche aussi avec stdout\n");
} |
Partager