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
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



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
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
}
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
}
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
}
OK, donc pas trop portable.. Merci.