Je crains que votre compréhension soit complètement à l'envers. :)
Pensez aux termes "entrée standard", "sortie standard" et "erreur standard" du point de vue de l'environnement. du programme et non du point de vue du noyau.
Lorsqu'un programme doit imprimer des données de sortie, il les imprime normalement sur la "sortie standard". Un programme imprime généralement la sortie sur la sortie standard avec printf
qui n'imprime QUE sur la sortie standard.
Lorsqu'un programme a besoin d'imprimer des informations sur les erreurs (pas nécessairement les exceptions, qui sont une construction du langage de programmation, imposée à un niveau beaucoup plus élevé), il imprime normalement sur "l'erreur standard". Il le fait normalement avec fprintf
qui accepte un flux de fichiers à utiliser lors de l'impression. Le flux de fichiers peut être n'importe quel fichier ouvert pour l'écriture : sortie standard, erreur standard, ou tout autre fichier qui a été ouvert avec la commande fopen
o fdopen
.
"standard in" est utilisé lorsque le fichier doit lire les données d'entrée, à l'aide de fread
o fgets
ou getchar
.
Chacun de ces fichiers peut être facilement redirigé à partir de l'enveloppe, comme ceci :
cat /etc/passwd > /tmp/out # redirect cat's standard out to /tmp/foo
cat /nonexistant 2> /tmp/err # redirect cat's standard error to /tmp/error
cat < /etc/passwd # redirect cat's standard input to /etc/passwd
Ou, toute l'enchilada :
cat < /etc/passwd > /tmp/out 2> /tmp/err
Il y a deux mises en garde importantes : Premièrement, "entrée standard", "sortie standard" et "erreur standard" ne sont qu'une convention. Il s'agit d'une très forte convention, mais il s'agit juste d'un accord sur le fait qu'il est très agréable de pouvoir exécuter des programmes comme celui-ci : grep echo /etc/services | awk '{print $2;}' | sort
et que les sorties standard de chaque programme soient reliées à l'entrée standard du programme suivant dans le pipeline.
Deuxièmement, j'ai donné les fonctions ISO C standard pour travailler avec les flux de fichiers ( FILE *
) -- au niveau du noyau, ce sont tous les descripteurs de fichiers ( int
références à la table des fichiers) et des opérations de niveau beaucoup plus bas comme read
y write
qui ne font pas l'heureuse mise en mémoire tampon des fonctions ISO C. Je me suis dit qu'il fallait rester simple et utiliser les fonctions les plus faciles, mais j'ai quand même pensé que vous deviez connaître les alternatives :)