J'ai bien peur que votre compréhension soit complètement à l'envers. :)
Pensez à «entrée standard», «sortie standard» et «erreur standard» du point de vue du programme , et non du point de vue du noyau.
Lorsqu'un programme doit imprimer une sortie, il imprime normalement en "sortie standard". Un programme imprime généralement la sortie en sortie standard avec printf, qui imprime UNIQUEMENT en sortie standard.
Lorsqu'un programme doit imprimer des informations sur les erreurs (pas nécessairement des exceptions, il s'agit d'une construction de langage de programmation, imposée à un niveau beaucoup plus élevé), il imprime normalement en "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 tout fichier ouvert en écriture: sortie standard, erreur standard ou tout autre fichier ouvert avec fopenou fdopen.
"standard in" est utilisé lorsque le fichier doit lire l'entrée, en utilisant freadou fgets, ou getchar.
N'importe lequel de ces fichiers peut être facilement redirigé depuis le shell, 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. C'est une convention très forte , mais tout cela n'est qu'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;}' | sortet d'avoir les sorties standard de chaque programme connecté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 *objets) - au niveau du noyau, ce sont tous les descripteurs de fichiers ( intréférences à la table de fichiers) et des opérations de niveau beaucoup plus bas comme readet write, qui ne le font pas faire le tampon heureux des fonctions ISO C. J'ai pensé à rester simple et à utiliser les fonctions les plus faciles, mais je pensais tout de même que vous devriez connaître les alternatives. :)