Lorsque vous essayez de rediriger la sortie du programme avec la syntaxe "un certain nombre supérieur à" (par exemple foo 2> myfile
), quels sont les nombres possibles ici et que représentent-ils?
Je crois que 1 est /dev/stdout
, 2 est /dev/stderr
. Et 5 et 6? Y a-t-il 3, 4 ou un nombre supérieur à 6?
io-redirection
file-descriptors
fifo
L'élève de Fermat
la source
la source
Réponses:
Ce programme supposé écrira le numéro de descripteur de fichier que vous avez spécifié. considérez le programme Hello World suivant:
compilez-le
maintenant une course simple
pas de fichier pour 5, donc pas d'octet écrit.
essayez ensuite:
J'arrive à obtenir une sortie tout en spécifiant un fichier et un descripteur de fichier (par exemple
5>u
).En pratique, à moins d'avoir écrit un programme aussi amusant que ci-dessus, il est peu probable que vous collectiez des données à l'aide
5>foo
.dans le script shell, les constructions utilisant <() sont plus utiles:
la source
write()
renvoiessize_t
, nonint
.Les nombres représentent les descripteurs de fichiers (gère les fichiers qui ont été ouverts).
La coque a généralement 3 ensembles automatiquement,
0 - stdin 1 - stdout 2 - stderr
Mais d'autres fichiers peuvent être ouverts et les nombres augmentent.
la source
Ces nombres sont des descripteurs de fichiers . Comme vous l'avez noté, plusieurs sont créés automatiquement. Au fur et à mesure que d'autres fichiers ou éléments similaires sont ouverts, ils obtiennent d'autres numéros.
Les nombres utilisés dans un programme particulier dépendent des fichiers ouverts par ce programme ou utilisés d'une autre manière. Par exemple, si vous souhaitez "enregistrer" le stdin actuel et rediriger temporairement le stdin ailleurs puis le restaurer plus tard, vous pouvez faire quelque chose comme:
Ce script aurait donc un
4
descripteur de fichier disponible au moins pendant un certain temps. Cela pourrait être tout ce qui n'est pas utilisé (eh bien, il y a une limite au nombre de fichiers qu'un processus peut avoir ouvert, mais tout ce qui est dans cette limite).Vous pouvez voir quels descripteurs de fichiers un processus a ouverts et où ils sont ouverts en regardant
/proc/<pid>/fd
. Cela montre tous les descripteurs de fichiers ouverts pour ce processus<pid>
et les fichiers auxquels ils sont associés.la source
Tout processus obtient des nombres entiers comme descripteurs de fichier, où il y en a trois réservés dans POSIX: 0 est stdin, 1 est stdout et 2 est stderr. Tous les autres fichiers se verront attribuer des numéros supplémentaires. Vous pouvez le vérifier facilement avec ce programme, l'enregistrer sous fdtest.c , afin qu'il ouvre son propre code de programme pendant l'exécution:
Compilez-le:
Exécuter:
La sortie que vous obtiendrez ressemble à ceci:
... qui est le numéro du descripteur de fichier du fichier référencé par la variable
fd
.la source