2009-05-18 11 views
4

Y a-t-il un moyen de savoir si stderr est envoyé à un fichier ou au terminal dans un programme C/C++? Je dois autre sortie message d'erreur selon que le programme est invoqué:Comment savoir si stderr dirige la sortie vers un fichier?

./program

ou comme:

./program 2 >> fichier

+1

Merci pour les réponses rapides. Je ne savais pas quoi faire pour trouver une réponse à Google, mais Stackoverflow FTW. – stonea

Répondre

11

Essayer utilisant isatty() sur le descripteur de fichier:

La fonction isatty() détermine si le descripteur de fichier fd se rapporte à un dispositif du type de terminal valide . La fonction fileno() examine le flux d'arguments et renvoie son descripteur d'entier .

Notez que stderr est toujours le descripteur de fichier 2, de sorte que vous ne vraiment pas besoin fileno() dans ce cas précis.

10

Oui, vous pouvez utiliser isatty(3) pour savoir si un descripteur de fichier fait référence au terminal ou à quelque chose d'autre (fichier, tuyau, etc.). Le descripteur de fichier 0 est stdin, 1 est stdout et 2 est stderr.

if(isatty(2)) 
    // stderr is a terminal 
+0

Quelle est la fiabilité de Windows? – JesperE

+3

Il n'existe pas sous Windows (sauf si vous compilez sous Cygwin, auquel cas il est fiable à 100%). –

+0

Était-ce le sarcasme? Est-ce qu'une partie de Cygwin est fiable à 100%? – bk1e

Questions connexes