Newsgroup: it.comp.lang.c
Titolo: Utilizzo di printef con \r alla fine in consolle application in cui ci siano un processo padre ed uno figlio

Ciao a tutti.
Avrei bisogno, se possibile di un chiarimento/aiuto.
 
Premessa: gia' da vari anni uso con successo delle printf a video con la \r alla fine (carriege retourn) per visualizzare per esempio di un ciclo di 2000 iterazioni, che il ciclo va avanti con printef del tipo
printf("Iterazione numero %4d \r",i);
fflush(stdout):
in cui nell'ultima riga della schermo vedo sempre la scritta e cambia solo il numero. (Devo forzare con fflush lo stdout per evitare che il video bufferizzi).
 
Adesso la questione e' leggermente piu' complessa.
 
Sto sviluppado un programma C che per mezzo di bus GBIP controlla vari strumenti e legge da una lan dei dati messi a disposizione dal dispositivo sotto test tramite istruzioni del tipo telnet.
 
Sostanzialmente si tratta di rilevare nello stesso istante due potenze, una tramite la GPIB e l'altra tramite la LAN. L'idea migliore che mi e' venuta e' stata quella di generare tramite una fork un processo figlio che dentro di se ha due while annidati con entrami una variabile presente in shared memory.
 
Il processo padre riesce a pilotare il figlio ed a sincronizzarlo con lui per mezzo dei due while annidati e le variabili in Shared Memory.
 
Qui finalmente arriviamo al problema che ho.
 
Sempre al fine di avere la sensazione che il programma giri, 
nel processo padre ho una scritta del tipo simile a quella precedente solo
che alla fine non c'e' assolutamente niente.
Il processo figlio dal canto suo effettua una scritta analoga:
printf("Iterazione del processo figlio n. %4d \r",j);
fflush(stdout);
che si affianca a quella del padre ed il tutto sta sulla medesima riga e posso contraollare, ogni tanto che i due processi siano sincroni.
Il tutto funziona se faccio come ho detto: se decido di fare apparire sulla medesima riga altri dati (
p.es
. la potenza letta) automaticamente la scritta va a capo e genera una serie di scritte, una sotto l'altra che mi riempiono il video.
 
Avreste idea di che cosa stia sbagliando?
Per  me sarebbe importante anche monitorare la potenza che a volte puo' andare a zero segnalando che il dispositivo non sta funzionando correttamente
e quindi fermare la misura.
 
Aggiungo che sono in XP in ambiente cygwin. Se servono ulteriori informazioni, ovviamente posso fornirle.
 
Grazie

 Avreste idea di che cosa stia sbagliando?
[..]
Premetto che non ho capito bene, cio� tu riesci a visualizzare padre e
figlio sulla stessa riga mentre la potenza no? Se � questo il problema
allora credo che il problema stia nel buffer orizzontale della console:
appena si riempie il programma butta a schermo la riga a capo e non
ritorna all'inizio. Allora devi fare una cosa semplicissima, aumenta la
capienza del buffer della console: tasto destro del mouse sulla console,
propriet� e cambia la voce "Screen Buffer Size"->"Width". Di default � 80,
tu portalo a 120 o pi�. Ti do un esempio-test:
 
 
#include <stdio.h>
 
void check_power(int a);
 
int main(void)
{
     int a, b, c;
     for(a = 0, b = 0; a < 1000000; a++, b++) {
         printf(" Iterazione Padre: %10d", a);
         printf(" Iterazione Figlio: %10d", b);
         check_power(a);
         putchar('\r');
         fflush(stdout);
     }
     return 0;
}
 
void check_power(int a)
{
     if(a % 11 == 0) {
         printf(" Potenza: %10d", a);
     }
}
 
se faccio girare questo programma su console con buffer di default (80)
va tutto bene. Se lo ricompilo con "%20d" invece di "%10d" mi va a capo..
significa che il buffer non ce la fa. Quindi devi prima verificare che
"%4d" sia la larghezza ottimale per i numeri da visualizzare e impostare
un buffer pi� capiente. Il mio esempio, dopo averlo ricompilato con "%20d"
e dopo aver impostato la buffer width a 120 non d� alcun problema.
 
-- 
Vincenzo Mercuri

      int a, b, c;
 
vab� la variabile 'c' � superflua.
 
-- 
Vincenzo Mercuri

 Vincenzo Mercuri
 
Grazie.
Grazie per l'esauriente spiegazione e grazie per l'esempio.
Leggendolo sembra l'uovo di Colombo ma da solo non ci sarei mai arrivato.
Grazie ancora.
 
Solo per chi dovesse leggere in futuro aggiungo che se si e' nella versione grafica (X Window) come e' possibile fare in cygwin, bisogna ricorrere 
all'istruzione
stty cols 120 (
p.es
)
per ottenere il medesimo effetto.
 
Ciao


[..]
 
Figurati.. anzi perdonami che per la mia sbadataggine ho dimenticato
che fossi su cygwin, usando mingw non mi sono posto il problema e
cambiavo il buffer a suon di click, hai fatto bene a dire come
si fa a cambiarlo in Xterm, io per esempio non lo ricordavo ;)
 
-- 
Vincenzo Mercuri


La parte difficile era individuare il problema. Non sapevo come si facesse su xterm, ma sapendo cosa cercare, con il man di xterm sono riuscito a trovare
l'istruzione stty cols N che ho inserito nel .bashrc cosi' questo proprieta' viene applicata a tutti gli xterm che apro.
 
L'idea che se hai un problema, qualcuno, disinteressatamente possa aiutarti e' quella che mi entusiasma di piu'. Mi piacerebbe saperne un po' di piu' per "tentare" di fare altrettanto, ma spesso, leggendo le domande, purtroppo devo scontrarmi con i miei limiti.
 
Grazie e Ciao