2010-06-03 5 views
3

J'ai ce comportement très étrange avec un code C++: Cela me donne des résultats différents lors de l'exécution avec et sans rediriger la sortie de l'écran vers un fichier (reproductible en cygwin et linux). Je veux dire, si je reçois le même exécutable et exécutez-le comme ./run ou exécutez-le comme ./run >out.log, j'obtiens des résultats différents!La redirection de la sortie d'écran vers un fichier peut-elle changer le résultat d'un code C++?

J'utilise std :: cout pour afficher à l'écran toutes les lignes se terminant par endl; J'utilise ifstream pour le fichier d'entrée; J'utilise ofstream pour la sortie, toutes les lignes se terminant par endl.

J'utilise g ++ 4.

Toute idée de ce qui se passe? MISE À JOUR: J'ai codé en dur les données d'entrée, donc 'ifstream' n'est pas utilisé, et le problème persiste.

MISE À JOUR 2: Ça devient intéressant. J'ai sondé trois variables qui sont calculées d'abord, et c'est ce que je reçois lors de l'utilisation avec et sans rediriger la sortie vers fichier

redirected to file: 0 -0.02 0

direct to screen: 0 -0.02 1.04083e-17

Donc, il y a une différence d'arrondi dans les variables de code avec et sans rediriger la sortie!

Maintenant, pourquoi rediriger interefere avec un calcul interne du code? MISE À JOUR 3: Si je redirige vers/dev/null, j'obtiens le comportement sam en sortie directement à l'écran, au lieu de rediriger vers le fichier.

+0

Quel genre de résultats différents? – djna

+0

Quels sont les résultats différents? –

+0

Qu'est-ce que vous obtenez pour le cas './run> out.log'? – Stewart

Répondre

2

Il existe un certain nombre d'effets d'exécution avec nohup, mais le principal est stdin et stdout sera redirigé vers/dev/null. Dans la plupart des cas, cela signifie que stdout sera entièrement tamponné au lieu de la ligne buffered (sa seule ligne buffered si stdout est un terminal), donc les choses qui sont généralement sorties ne seront pas réellement sorties jusqu'à ce que vous vidiez explicitement.

Modifier

autres mises à jour il est peu probable que le problème est directement lié au comportement différent de nohup. À ce stade, je suggère d'exécuter avec valgrind, car le suspect le plus probable est une variable locale non initialisée ou un objet tas. Une telle variable aura une valeur imprévisible (mais généralement répétable) qui dépend de l'environnement dans lequel la fonction a été invoquée - principalement sur ce que les fonctions précédemment appelées ont laissé sur la pile, ce qui pourrait bien dépendre de nohup comme vous le voyez

+0

Ne va-t-il pas à un fichier journal par défaut? – Arafangion

+0

non, il va à/dev/null par défaut - vous devez rediriger explicitement vers un fichier journal, comme le fait l'OP –

+0

+1 Votre modification concernant l'environnement d'exécution semble probable. –

0

Utilisez-vous des threads dans cette application?

J'ai vu un comportement subtilement différent dans une application thread mal synchronisée sur Linux avec/sans nohup, bien que je ne sache pas si cela aurait été reproduit avec cygwin.

Dans mon cas, j'avais deux threads d'initialisation, mais l'ordre dans lequel ils se sont terminés était (par erreur) significatif. Sans 'nohup', on compléterait toujours en premier, mais avec 'nohup', l'autre le ferait généralement, je pense que la cause sous-jacente était les différences dans la mise en mémoire tampon des E/S.

+0

Aucun threading ... – Biga

+0

@Biga Eh bien, cela valait la peine d'être mentionné. Je vais le laisser ici au cas où cela aiderait quelqu'un d'autre. – Stewart