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 fopen
ou fdopen
.
"standard in" est utilisé lorsque le fichier doit lire l'entrée, en utilisant fread
ou 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;}' | sort
et 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 ( int
références à la table de fichiers) et des opérations de niveau beaucoup plus bas comme read
et 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. :)