IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> [résolu] fprintf, indicateur de progression, stdout et stderr, Comportement différent
Options
audionuma
posté 27 May 2017, 09:56
Message #1


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 1 895
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
Go to the top of the page
 
+Quote Post
Jaypee
posté 27 May 2017, 16:03
Message #2


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 341
Inscrit : 29 Aug 2002
Membre no 3 340



Suggestion n°1 pas chère smile.gif
- 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.
Go to the top of the page
 
+Quote Post
audionuma
posté 27 May 2017, 21:38
Message #3


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 1 895
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
Go to the top of the page
 
+Quote Post
audionuma
posté 28 May 2017, 20:00
Message #4


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 1 895
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
Go to the top of the page
 
+Quote Post
audionuma
posté 30 May 2017, 14:48
Message #5


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 1 895
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
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 20th May 2018 - 13:08