6
votes

Où est le tampon stdout?

Comme nous le savons, stdout est tamponné sous Linux. Ma question est la suivante: 1) Est-ce un tampon global partagé par tous les processus? ou un tampon pour chaque processus? 2) Où est le tampon? sur la pile ou le tas ou la zone statique? 3) Qui le crée?


2 commentaires

Qu'est-ce que tu en as à faire?


Ma compréhension est qu'elle est créée par le noyau dans une zone de tas de noyau et est ensuite accessible via / dev / stdout.


3 Réponses :


3
votes

stdout est un fichier C CORE Créé par la bibliothèque standard, le code correspondant est donc chargé dans le cadre de votre bibliothèque C. Sur Linux, il sera mis en œuvre en termes de descripteurs de fichier POSIX.

Votre bibliothèque C et le noyau peuvent utiliser la tampon; Vous devrez vérifier les documentations individuelles. Je recommande de commencer par examiner la partie pertinente du code source de la bibliothèque C (c'est-à-dire la partie qui implémente ), qui devrait être très éducatif.


0 commentaires

2
votes

Meilleure ressource pour en savoir plus sur la bibliothèque standard C dans les détails d'escrupteur est PJ Plaudeur's La bibliothèque C standard C . Il décrit toutes les questions qui se sont posées lorsqu'il a mis en œuvre la bibliothèque par lui-même (en msword! Sur un ordinateur portable Win3.1! En vacances!).

Il donne également des informations détaillées sur la manière d'utiliser (et testez) toutes les fonctions. < / p>

pour le côté UNIX (Linux), vous devez commencer à lire sur 'Inode, qui est la structure de données classique pour stocker des fichiers mis en cache en mémoire. Le livre classique pour cela est la conception du système d'exploitation UNIX par Maurice J. Bach.


D'accord, maintenant que vous êtes précieusement grondé pour ne pas avoir lu tous les vieux livres et toutes les pages Wiki associées.

Voici une citation pertinente de la bibliothèque C standard C , p. 256.

Vous pouvez, en principe, exercer une certaine quantité de contrôle sur la manière dont les fonctions d'E / S sont soumises à des données tampon pour un flux. Vous devez toutefois réaliser que la mise en mémoire tampon est une optimisation basée sur diverses conjectures sur les modèles d'E / S. Ces conjectures sont généralement correctes et de nombreuses implémentations suivent votre conseil. Mais ils n'ont pas à. Une implémentation est libre d'ignorer la plupart de vos demandes tampon.

Néanmoins, si vous pensez qu'un gros tampon améliorera les performances ou un tampon plus petit sauvera de l'espace, vous pouvez fournir votre propre tampon candidat. Appelez la fonction SETVBUF Après avoir ouvert le fichier et avant d'effectuer d'autres opérations sur le flux. (Évitez la fonction plus ancienne SETBUF , qui est moins flexible.) Vous pouvez spécifier si des E / S doivent être entièrement tamponnés, tamponnés par des lignes de texte ou non défectueuses. Cela pourrait faire une différence dans la performance de votre programme.

...

SETBUF - Utilisez SETVBUF au lieu de cette fonction pour obtenir plus de contrôle.

SETVBUF - En règle générale, il est préférable de laisser la bibliothèque C standard c Déterminer comment tamponner l'entrée / la sortie pour vous. Si vous êtes certain que vous ne voulez pas de mémoire tamponnage ou de mise en mémoire tampon à la fois, utilisez cette fonction pour initialiser correctement le courant. Call SETVBUF immédiatement après avoir ouvert le flux. Presque toute opération sur le flux préemptera votre droit de choisir une stratégie tampon. Si vous spécifiez votre propre tampon avec cet appel, ne supposez pas que le flux l'utilisera réellement. Et jamais modifier le contenu du tampon pendant que le flux est ouvert. Le mode (troisième) argument doit avoir l'une des valeurs _iofbf , _IOLBF ou _ionbf , décrit ci-dessus. Voir également le macro bufsiz , décrit [ailleurs].

... xxx

Donc, au moins dans cette implémentation, le tampon par défaut vit probablement dans la structure de fichiers et est alloué sur le tas. Nous pouvons voir ici son frère, un tampon de caractère ( str -> _ cbuf ), est utilisé pour "nonuffered".


0 commentaires

0
votes

Cela dépend de la façon dont vous écrivez sur stdout. Si vous utilisez stdio , il s'agira de la ligne tamponnée, si la sortie va à la TTY. Sinon, il sera complètement tamponné.

Voir aussi homme stdio < / code> pour plus de détails.

Si vous utilisez des routines de faible niveau comme < Code> écrire , seuls les octets donnés sont écrits. Selon la cible, il y aura la tampon dans le noyau. Si la cible est une TTY, elle peut être écrite directement sur le terminal.


0 commentaires