10
votes

La question concernant Cerr Cout et Start

Quelqu'un peut-il expliquer la différence entre Cerr Couch et Scrog et pourquoi différents objets sont proposés?

Je sais que les différences sont comme ci-dessous:

1) COUT peut redirigé mais CERR ne peut pas

2) Le sabot peut utiliser la mémoire tampon.

Je suis confus sur le point 2, je suis reconnaissant si quelqu'un peut le préciser davantage.


1 commentaires

Qui a dit que Cerr ne peut-il pas être redirigé? Je le fais tout le temps!


5 Réponses :


2
votes

Les deux peuvent être redirigés.
Sur la plupart des implémentations, CERR ne serait pas tamponné, pas sûr s'il s'agit d'une exigence officielle POSIX, mais il est fou d'avoir un flux d'erreur tampon.

La raison d'avoir des flux séparés provient de la philosophie UNIX que la production d'un programme est l'entrée à l'autre. Si "LS" va droit à "trier", il est plus facile d'avoir des erreurs sur la console que d'écrire un tri pour comprendre si une entrée est un message d'erreur ou une partie du texte que vous souhaitez trier.


0 commentaires

3
votes

La sortie tamponnée est typiquement beaucoup plus rapide que nonuffer. Donc, si vous vouliez écrire rapidement une vaste quantité de données à un journal (mais je m'en fous si cela s'est effectivement fini), vous utiliseriez STALK plutôt que CERR.

et tous les flux peuvent normalement être redirigés, en supposant un système d'exploitation vaguement compétent, mais ceci est suit la norme C ++, qui n'a pas de concept de ce type de "redirection".


3 commentaires

Vous voudrez peut-être élaborer un peu à la hausse de la bouleversement de Cerr / non tamponnaires - I.e. Le flux est écrit même si quelque chose de mal arrive juste après l'opération d'écriture.


@RAPHAELSP C'est ce que je voulais dire par "(mais je m'en fous si cela s'est effectivement fini là-haut)"


@Neil: L'OP étant apparemment confus sur quel tampon est, je pense que la formulation pourrait être plus claire :)



16
votes

La sortie peut être tamponnée ou ignorée. Avec la sortie tamponnée, la mise en œuvre enregistre toute la sortie jusqu'à ce qu'il soit pratique pour l'écrire sur le disque (ou où). C'est bien et efficace, mais si le programme bloque une certaine production sera très probablement perdu. La mise en œuvre doit écrire une sortie nonufferée sur le disque tel qu'il se produit, ce qui peut ralentir des choses avec beaucoup d'écrivies de disque, mais à moins d'une crash de programme lorsqu'il est écrit, il sera écrit sur le disque.

Il n'y a pas de différence fonctionnelle réelle entre la sortie standard et l'erreur standard; Ils ne sont que deux flux de sortie différents pouvant être redirigés séparément. La philosophie UNIX des outils de chaînage ensemble est que la sortie standard aura la sortie appropriée pour entrer dans l'entrée de l'outil suivant, ce qui nécessite un flux séparé pour les messages d'erreur.

donc, COUT écrit à la sortie standard et est tamponné. Utilisez ceci pour une sortie normale. cerr écrit au flux d'erreur standard et est absorbé. Utilisez ceci pour les messages d'erreur. Clog écrit au flux d'erreur standard, mais est tamponné. Ceci est utile pour la journalisation d'exécution, car elle n'interfère pas avec la sortie standard, mais est efficace (au coût que la fin du journal risque d'être perdue si le programme se bloque).


0 commentaires

1
votes
cout-Screen output(stdout)
clog-Buffered output of standard error(stderr)
cerr-Standard error device output (stderr)

0 commentaires

0
votes

L'une des principales raisons de l'utilisation de la production tamponnée et non coupée peut être observée en prenant un crash de programme à titre d'exemple.

envisager un programme qui suscite quelque chose dans un fichier journal. Et tout à coup le programme s'est écrasé. Vous êtes peut-être intéressé à ce stade dans la connaissance de l'erreur qui l'a fait crash, mais si vous aviez utilisé Scrog (tamponnier) pour tous les journaux et erreurs, vous ne voyez peut-être pas toutes ces informations car celles-ci pourraient toujours être soumises au tampon lorsque le programme s'est écrasé de manière possible. Le tampon est également perdu.

donc en cas d'erreur, CERR est principalement utilisé car cela est absorbé et il ne peut y avoir de situation maintenant lorsqu'une erreur majeure est perdue lors d'un crash de programme juste parce qu'il était dans la mémoire tampon.


0 commentaires