freopen("/my/newstdin", "r", stdin);
freopen("/my/newstdout", "w", stdout);
freopen("/my/newstderr", "w", stderr);
... do your stuff
freopen("/dev/stdin", "r", stdin);
...
...
Cela fait grimper l'aiguille de mon round-peg-square-hole-o-meter, que cherchez-vous à accomplir ?
Edit :
Rappelez-vous que stdin, stdout et stderr sont les descripteurs de fichiers 0, 1 et 2 pour chaque processus nouvellement créé. freopen() devrait conserver les mêmes fd's, en leur assignant simplement de nouveaux flux.
Ainsi, une bonne façon de s'assurer que cela fait réellement ce que vous voulez que cela fasse serait :
printf("Stdout is descriptor %d\n", fileno(stdout));
freopen("/tmp/newstdout", "w", stdout);
printf("Stdout is now /tmp/newstdout and hopefully still fd %d\n",
fileno(stdout));
freopen("/dev/stdout", "w", stdout);
printf("Now we put it back, hopefully its still fd %d\n",
fileno(stdout));
Je pense que c'est le comportement attendu de freopen(), comme vous pouvez le voir, vous n'utilisez toujours que trois descripteurs de fichiers (et les flux associés).
Cela annule toute redirection de l'interpréteur de commandes, car il n'y a rien à rediriger pour l'interpréteur de commandes. Cependant, cela va probablement casser les pipes. Vous devriez vous assurer de mettre en place un gestionnaire pour SIGPIPE, au cas où votre programme se trouverait à l'extrémité bloquante d'un pipe (pas FIFO, pipe).
Ainsi, ./votre_programme --stdout /tmp/stdout.txt --stderr /tmp/stderr.txt devrait être facilement réalisé avec freopen() et en gardant les mêmes descripteurs de fichiers réels. Ce que je ne comprends pas, c'est pourquoi il faudrait les remettre en place après les avoir modifiés ? Si quelqu'un a passé l'une ou l'autre option, il veut sûrement qu'elle persiste jusqu'à la fin du programme ?
1 votes
Notez que
stdin
,stdout
ystderr
sont des variables globales.