[résolu] fprintf, indicateur de progression, stdout et stderr, Comportement différent |
Bienvenue invité ( Connexion | Inscription )
[résolu] fprintf, indicateur de progression, stdout et stderr, Comportement différent |
27 May 2017, 09:56
Message
#1
|
|
Macbidouilleur d'Or ! Groupe : Membres Messages : 2 031 Inscrit : 27 Apr 2004 Membre no 18 176 |
Bonjour,
dans r128x, j'utilise l'instruction suivante pour afficher un indicateur de progression : Code printf("%3d%% \n\033[F\033[J", (int)(ratio)); https://github.com/audionuma/r128x/blob/mas...CliController.m, ligne 51 Un utilisateur me fait remarquer que lorsque on redirige la sortie de l'appli vers un fichier texte, cela inscrit un tas de caractères inutiles dans le fichier texte. Je me suis donc dit qu'une solution possible serait de rediriger l'indicateur de progression vers stderr, cela permettant que la progression soit affichée dans le terminal mais non incluse dans la redirection (qui, si j'ai bien compris, ne comprend que stdout par défaut). Malheureusement : Code fprintf(stderr, "%3d%% \n\033[F\033[J", (int)(ratio)); ne produit pas le résultat escompté (la progression ne s'affiche pas dans le terminal). Un simple Code fprintf(stderr, "ici stderr\n"); affiche bien la chaîne dans le terminal. Avez vous une piste à me suggérer ? Merci. Ce message a été modifié par audionuma - 30 May 2017, 14:49. -------------------- Membre du club des AIPBP (Anciens Inscrits Pas Beaucoup de Posts) Voir la liste
Futur ex-macbidouilleur, sous Dell / Ubuntu depuis 2021 ! |
|
|
27 May 2017, 16:03
Message
#2
|
|
Macbidouilleur d'Or ! Groupe : Membres Messages : 2 486 Inscrit : 29 Aug 2002 Membre no 3 340 |
Suggestion n°1 pas chère
- Documenter la commande awk ou la commande sed filtant les "escape sequences" et grep -v ^(.*?)\%$ qui va bien. - Fournir le script shell qui va le faire r128x ... | sed ... | grep -v ^(.*?)\%$ > file.txt Suggestion n° 2 Doubler les fprintf par du logging https://developer.apple.com/reference/os/logging J-P Ce message a été modifié par Jaypee - 27 May 2017, 16:30. |
|
|
27 May 2017, 21:38
Message
#3
|
|
Macbidouilleur d'Or ! Groupe : Membres Messages : 2 031 Inscrit : 27 Apr 2004 Membre no 18 176 |
Merci @Jaypee.
Bon, sed/awk/grep c'est une piste, bien sûr, mais ce n'est pas celle que je privilégie pour les utilisateurs. En fait, l'utilisateur suffisamment averti fera ça de lui même, je crois (ou il ira commenter la ligne dans le code source avant de compiler son propre binaire). Et le logging mentionné https://developer.apple.com/reference/os/logging a un gros défaut : Citation Important Unified logging is available in iOS 10.0 and later, macOS 10.12 and later, tvOS 10.0 and later, and watchOS 3.0 and later Je roule moi même sous 10.10.5 et théoriquement l'appli est compatible pour les OS à partir de 10.6 inclus. Je regarde du côté de NSLog mais rien de probant jusqu'à maintenant. Donc, je souhaite comprendre pourquoi ce qui marche dans stdout ne marche pas dans stderr en fait. Et je rappelle que cette appli est uniquement Mac OS (heu ... macOS) , pas de problèmes de portabilité linux/bsd/... -------------------- Membre du club des AIPBP (Anciens Inscrits Pas Beaucoup de Posts) Voir la liste
Futur ex-macbidouilleur, sous Dell / Ubuntu depuis 2021 ! |
|
|
28 May 2017, 20:00
Message
#4
|
|
Macbidouilleur d'Or ! Groupe : Membres Messages : 2 031 Inscrit : 27 Apr 2004 Membre no 18 176 |
Bon, après plus amples investigations, je pense que le problème vient de la différence de mode de fonctionnement : stdout est bufferisé par défaut, tandis que stderr ne l'est pas.
Mais quelques expériences de forçage de bufferisation de stderr n'ont produit que des résultats ... insatisfaisants. -------------------- Membre du club des AIPBP (Anciens Inscrits Pas Beaucoup de Posts) Voir la liste
Futur ex-macbidouilleur, sous Dell / Ubuntu depuis 2021 ! |
|
|
30 May 2017, 14:48
Message
#5
|
|
Macbidouilleur d'Or ! Groupe : Membres Messages : 2 031 Inscrit : 27 Apr 2004 Membre no 18 176 |
Je suis finalement parvenu à mes fins je crois :
https://github.com/audionuma/r128x/tree/progress-on-stderr 1 - forcer stderr à bufferiser les lignes (comportement par défaut de stdout) Code setvbuf(stderr, NULL, _IOLBF, 128); 2 - écrire l'indicateur de progression dans stderr Code fprintf(stderr, "%3d%% \n\033[F\033[J", (int)(ratio)); 3 - flusher stderr avant d'essayer d'écrire dans stdout Code fflush(stderr); printf(...); -------------------- Membre du club des AIPBP (Anciens Inscrits Pas Beaucoup de Posts) Voir la liste
Futur ex-macbidouilleur, sous Dell / Ubuntu depuis 2021 ! |
|
|
Nous sommes le : 19th April 2024 - 03:34 |