Confus à propos de stdin, stdout et stderr?

je suis assez confus avec le but de ces trois dossiers. Si mon interprétation est correcte, stdin est le fichier dans lequel un programme écrit ses requêtes pour exécuter une tâche dans le processus, stdout est le fichier dans lequel le noyau écrit sa sortie et le processus lui demandant l'accès aux informations de, et stderr est le fichier dans lequel toutes les exceptions sont entrées. En ouvrant ces dossiers pour vérifier si ceux-ci se produisent réellement, je n'ai rien trouvé semblent le suggérer!

ce que je voudrais savoir, c'est quel est exactement le but de ces fichiers, réponse absolument stupide avec très peu de jargon technique!

132
demandé sur Jonathan Leffler 2010-08-02 09:20:23

10 réponses

entrée Standard - il s'agit du file handle que votre processus lit pour obtenir des informations de votre part.

sortie Standard - votre processus écrit des informations normales à ce gestionnaire de fichier.

standard error - votre processus écrit des informations d'erreur à ce gestionnaire de fichier.

la faire :-)

bien sûr, c'est la plupart du temps par convention. Rien ne vous empêche d'écrire vos informations d'erreur en sortie standard si vous le souhaitez. Vous pouvez même fermer complètement les trois poignées de fichier et ouvrir vos propres fichiers pour I / O.

lorsque votre processus commence, il devrait déjà avoir ces poignées ouvertes et il peut simplement lire et/ou écrire à eux.

par défaut, ils sont probablement connectés à votre terminal (par exemple, /dev/tty ) mais les shells vous permettront de configurer des connexions entre ces poignées et des fichiers et/ou des dispositifs spécifiques (ou même des pipelines vers d'autres processus) avant que votre processus ne commence (certaines des manipulations possibles sont plutôt astucieuses).

exemple:

my_prog <inputfile 2>errorfile | grep XYZ

qui sera:

  • créer un processus pour my_prog .
  • open inputfile comme standard entrée (poignée de fichier 0).
  • ouvrir errorfile que votre erreur standard (descripteur de fichier 2).
  • créer l'autre processus de grep .
  • joindre la sortie standard de my_prog à l'entrée standard de grep .

votre commentaire:

quand j'ouvre ces fichiers dans le dossier / dev, comment Je ne vois jamais le résultat d'un processus en cours?

c'est parce que ce ne sont pas des fichiers normaux. Alors que UNIX présente tout comme un fichier dans un système de fichiers quelque part, cela ne le rend pas si bas. La plupart des fichiers de la hiérarchie /dev sont des périphériques de type caractère ou bloc, en fait un pilote de périphérique. Ils n'ont pas de taille mais ils ont un numéro de périphérique majeur et mineur.

Lorsque vous les ouvrez, vous êtes connecté au pilote de périphérique plutôt qu'à un fichier physique, et le pilote de périphérique est suffisamment intelligent pour savoir que les processus séparés doivent être traités séparément.

il en va de même pour le système de fichiers /proc de Linux. Ce ne sont pas de vrais fichiers, juste des passerelles étroitement contrôlées vers les informations du noyau.

159
répondu paxdiablo 2017-12-11 04:19:26

il serait plus correct de dire que stdin , stdout , et stderr sont" I/O streams " plutôt que les fichiers. Comme vous l'avez remarqué, ces entités ne vivent pas dans le système de fichiers. Mais l' La philosophie d'Unix, en ce qui concerne les e/s, est "tout est un fichier". Dans la pratique, cela signifie vraiment que vous pouvez utiliser les mêmes fonctions et interfaces de bibliothèque ( printf , scanf , read , write , select , etc.) sans se soucier de savoir si les I/O flux est connecté à un clavier, un fichier disque, une socket, un tuyau, ou une autre abstraction d'e/s

la plupart des programmes doivent lire les entrées, écrire les sorties et enregistrer les erreurs, donc stdin , stdout , et stderr sont prédéfinis pour vous, comme une commodité de programmation. Ce n'est qu' une convention, et n'est pas appliquée par le système d'exploitation.

38
répondu Jim Lewis 2010-08-02 05:36:59

je crains que votre compréhension soit complètement à l'envers. :)

pensez à "standard in", "standard out", et "standard error" du point de vue du programme , pas du point de vue du noyau.

quand un programme a besoin d'Imprimer la sortie, il imprime normalement"standard out". Un programme imprime typiquement la sortie à la norme avec printf , qui imprime seulement à la norme.

Lorsqu'un programme a besoin d'imprimer des informations d'erreur (pas nécessairement des exceptions, celles-ci sont 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 fichier peut être n'importe quel fichier ouvert en écriture: standard, standard d'erreur, ou tout autre fichier qui a été ouvert avec fopen ou fdopen .

"standard" est utilisé lorsque le fichier doit lire input, utilisez fread ou fgets , ou getchar .

N'importe lequel de ces fichiers peut être facilement redirigé à partir du 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," standard in"," standard out "et" standard error " ne sont qu'une convention. Ils sont un très fort convention, mais ce 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 ;}' | sort et d'avoir les sorties standards de chaque programme connectés à l'entrée standard du prochain programme 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 font pas le tampon heureux des fonctions ISO c. J'ai pensé que pour rester simple et utiliser les fonctions les plus faciles, mais je pensais quand même que vous devriez connaître les alternatives. :)

20
répondu sarnold 2010-08-02 05:47:13

en complément des réponses ci-dessus, voici un résumé des Redirections: Redirections cheatsheet

13
répondu Leopold Gault 2018-06-11 11:17:19

stdin

lit l'entrée à travers la console (par exemple L'entrée au clavier). Utilisé en C avec scanf

scanf(<formatstring>,<pointer to storage> ...);

stdout

produit une sortie vers la console. Utilisé en C avec le printf

printf(<string>, <values to print> ...);

stderr

produit une sortie "erreur" vers la console. Utilisé en C avec fprintf

fprintf(stderr, <string>, <values to print> ...);

Redirection

la source de stdin peut être redirigée. Par exemple, au lieu de provenir d'une entrée clavier, elle peut provenir d'un fichier ( echo < file.txt ), ou d'un autre programme ( ps | grep <userid> ).

les destinations pour stdout, stderr peuvent également être redirigées. Par exemple stdout peut être redirigée vers un fichier: ls . > ls-output.txt , dans ce cas, la sortie est écrite dans le fichier ls-output.txt . Stderr peut être redirigé avec 2> .

7
répondu mikek3332002 2017-12-12 21:22:16

en utilisant ps-aux révèle les processus courants, tous listés dans /proc /as/proc/ (pid)/, en appelant cat/proc/(pid)/fd / 0 il imprime tout ce qui se trouve dans la sortie standard de ce processus je pense. Alors peut-être,

/proc/(pid)/fd / 0 - fichier de sortie Standard

/ proc / (pid)/fd / 1 - Fichier D'entrée Standard

/ proc / (pid) / fd / 2 - Fichier D'erreur Standard

par exemple my terminal window

mais cela n'a bien fonctionné que pour / bin / bash les autres processus n'avaient généralement rien en 0 mais beaucoup avaient des erreurs écrites en 2

3
répondu Sam 2014-07-27 00:16:04

je pense que les gens qui disent que stderr ne doit être utilisé que pour les messages d'erreur sont trompeurs. Il devrait également être utilisé pour les messages informatifs qui sont destinés à l'utilisateur qui exécute la commande et non pour les consommateurs potentiels en aval des données (c.-à-d. Si vous exécutez un pipe shell enchaînant plusieurs commandes, vous ne voulez pas que les messages informatifs comme "getting item 30 of 42424" d'apparaître sur stdout car ils vont confondre le consommateur, mais vous pourriez toujours vouloir que l'utilisateur de les voir.

Voir http://www.jstorimer.com/blogs/workingwithcode/7766119-when-to-use-stderr-instead-of-stdout pour la justification historique:

" tous les programmes ont placé des diagnostics sur la sortie standard. Cela a toujours causé des problèmes lorsque la sortie a été redirigée dans un fichier, mais est devenu intolérable lorsque la sortie a été envoyée à un processus sans méfiance. Néanmoins, ne voulant pas violer la simplicité du modèle standard-input-standard-output, les gens toléré cet état de fait à travers v6. Peu après Dennis Ritchie a coupé le nœud gordien en introduisant le fichier d'erreur standard. Ce n'était pas assez. Avec pipelines diagnostics pourraient provenir de l'un de plusieurs programmes fonctionnant simultanément. Diagnostics nécessaires pour s'identifier."

2
répondu dee 2017-01-20 15:14:44

stderr ne fera pas de mise en tampon de Cache IO de sorte que si notre application a besoin d'imprimer des informations de message critiques (quelques erreurs ,exceptions) à la console ou au fichier l'utiliser où que l'utilisation stdout pour imprimer des informations générales de journal comme il utilise la mise en tampon de Cache IO, il ya une chance que avant d'écrire nos messages à l'application de fichier peut fermer ,laissant complexe débogage

1
répondu geekanil 2018-02-13 14:02:13

pour des informations faisant autorité sur ces fichiers, consultez les pages de manuel, lancez la commande sur votre terminal.

$ man stdout 

Mais pour une réponse simple, chaque fichier est:

stdout pour un flux de

stdin pour un flux d'entrée

stderr pour les erreurs d'impression ou l'enregistrement des messages.

chaque unix le programme comporte chacun de ces volets.

1
répondu Margach Chris 2018-07-17 14:58:46

un fichier avec des tampons associés est appelé un flux et est déclaré être un pointeur vers un fichier de type défini. La fonction fopen () crée certaines données descriptives pour un flux et renvoie un pointeur pour désigner le flux dans toutes les transactions ultérieures. Normalement, il y a trois flux ouverts avec des pointeurs constants déclarés dans l'en-tête et associés aux fichiers ouverts standard. Au démarrage du programme, trois flux sont prédéfinis et n'ont pas besoin d'être ouverts explicitement: lire l'entrée conventionnelle), la sortie standard (pour l'écriture de la sortie conventionnelle), et l'erreur standard (pour l'écriture de la sortie diagnostique). Lorsqu'il est ouvert, le flux d'erreurs standard n'est pas complètement amorti; les flux d'entrées et de sorties standard sont entièrement amortis si et seulement si le flux peut être déterminé qu'il ne se réfère pas à un dispositif interactif

https://www.mkssoftware.com/docs/man5/stdio.5.asp

0
répondu Bahruz Balabayov 2017-09-28 13:57:35