GNT sans publicité, site mobile, fonctionnalitées exclusives...

Rediriger stderr vers une fonction

Le
cLx
Bonjour,

J'ai dans mon programme et pas mal de ses modules des messages d'erreurs qui
sont envoyés avec fprintf(stderr, );.

Le truc c'est que maintenant qu'on fait une belle interface avec Curses, on
voudrait afficher les messages d'erreur dans une fenêtre pour. Serait-il
possible de rediriger stderr (et stdout) vers une fonction, même via un pipe,
un peu comme freopen mais pas vers une fichier ?

Merci,

--
cLx
Lire les 9 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jean-Marc Bourguet
Le #23676991
cLx
J'ai dans mon programme et pas mal de ses modules des messages d'erreurs qui
sont envoyés avec fprintf(stderr, ...);.

Le truc c'est que maintenant qu'on fait une belle interface avec Curses, on
voudrait afficher les messages d'erreur dans une fenêtre pour. Serai t-il
possible de rediriger stderr (et stdout) vers une fonction, même via un pipe,
un peu comme freopen mais pas vers une fichier ?



Rien en standard. Glibc a une notion de "custom stream" (voir le
manuel) mais c'est donc pratiquement que sous Linux et je n'ai pas le
souvenir de quelquechose d'equivalent ailleurs.

A+

--
Jean-Marc
FAQ de fclc: http://www.levenez.com/lang/c/faq
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Xavier Roche
Le #23677121
Le 23/08/2011 14:20, cLx a écrit :
Le truc c'est que maintenant qu'on fait une belle interface avec Curses, on
voudrait afficher les messages d'erreur dans une fenêtre pour. Serait-il
possible de rediriger stderr (et stdout) vers une fonction, même via un pipe,
un peu comme freopen mais pas vers une fichier ?



Il suffit de reassigner le handle 2 (pour stderr - ou 1 pour stdout)
vers autre chose, comme.. un pipe, et de créer un thread qui ira lire
dessus:

const int errFd = 2;
int pipeFds[2];
if (pipe(pipeFds) == 0) {
const int rFd = pipeFds[0];
const int wFd = pipeFds[1];
if (dup2(wFd, errFd) == 0) {
.. créer un thread de fond pour lire les données depuis rFd
} else {
.. blah
}
} else {
.. blah
}
Xavier Roche
Le #23677241
Le 23/08/2011 14:20, cLx a écrit :
Le truc c'est que maintenant qu'on fait une belle interface avec Curses, on
voudrait afficher les messages d'erreur dans une fenêtre pour. Serait-il
possible de rediriger stderr (et stdout) vers une fonction, même via un pipe,
un peu comme freopen mais pas vers une fichier ?



Il suffit de reassigner le handle 2 (pour stderr - ou 1 pour stdout)
vers autre chose, comme.. un pipe, et de créer un thread qui ira lire
dessus:

const int errFd = 2;
int pipeFds[2];
if (pipe(pipeFds) == 0) {
const int rFd = pipeFds[0];
const int wFd = pipeFds[1];
if (dup2(wFd, errFd) == 0) {
close(wFd);
.. créer un thread de fond pour lire les données depuis rFd
} else {
.. blah
}
} else {
.. blah
}
Xavier Roche
Le #23677231
Le 23/08/2011 14:20, cLx a écrit :
Le truc c'est que maintenant qu'on fait une belle interface avec Curses, on
voudrait afficher les messages d'erreur dans une fenêtre pour. Serait-il
possible de rediriger stderr (et stdout) vers une fonction, même via un pipe,
un peu comme freopen mais pas vers une fichier ?



Il suffit de reassigner le handle 2 (pour stderr - ou 1 pour stdout)
vers autre chose, comme.. un pipe, et de créer un thread qui ira lire
dessus:

const int errFd = fileno(stderr); /* en théorie 2 :) */
int pipeFds[2];
if (pipe(pipeFds) == 0) {
const int rFd = pipeFds[0];
const int wFd = pipeFds[1];
if (dup2(wFd, errFd) == 0) {
close(wFd);
.. créer un thread de fond pour lire les données depuis rFd
} else {
.. blah
}
} else {
.. blah
}
cLx
Le #23677221
On 23/08/2011 14:41, Jean-Marc Bourguet wrote:
Rien en standard. Glibc a une notion de "custom stream" (voir le
manuel) mais c'est donc pratiquement que sous Linux et je n'ai pas le
souvenir de quelquechose d'equivalent ailleurs.



OK, donc pas trop portable.. Merci.
Publicité
Suivre les réponses
Poster une réponse
Anonyme