int
main (int argc, char *argv[])
{
int cnt;
for (cnt = 0; cnt < 10; cnt++ ) {
printf ("ciao\n");
sleep (1);
}
}
---
Quando utilizzo la redirezione dello standard output su file,
alla fine dell'esecuzione è tutto ok.
---
user@ubuntu704desktop:~/temp/tmp2$ gcc -o prova prova.c && ./prova
>dati.txt
user@ubuntu704desktop:~/temp/tmp2$ cat dati.txt
ciao
ciao
ciao
ciao
ciao
ciao
ciao
ciao
ciao
ciao
user@ubuntu704desktop:~/temp/tmp2$
---
Se durante l'esecuzione premo Ctlr-C (quindi invio il segnale SIGINT
al processo),
ovviamente il programma termina, ma dati.txt risulta vuoto:
---
user@ubuntu704desktop:~/temp/tmp2$ gcc -o prova prova.c && ./prova
>dati.txt
<...ho premuto Ctrl-C...>
user@ubuntu704desktop:~/temp/tmp2$ cat dati.txt
user@ubuntu704desktop:~/temp/tmp2$
---
Sembra che l'invio del segnale SIGINT non gestisca il flushing dei
dati scritti su stdout
quando c'è redirezione su un file.
Esiste qualche altro segnale che è possibile inviare per fare in modo
che nel file d'uscita
vengano scritti i messaggi su stdout fino al momento
dell'interruzione? Intercettando il
SIGINT, come potrei obbligare il sistema operativo a scrivere quello
che fino ad ora è stato
scritto?
Può esserci un modo migliore per fare ciò?
In pratica ho un'applicazione che scrive su stdout. Io voglio
redirezionare lo stdout su file,
ma ho anche la necessità di bloccarla, senza perdere ciò che ha
scritto fino al momento
dell'interruzione.
> Ecco un mio semplice programma:
> ---
> user@ubuntu704desktop:~/temp/tmp2$ cat prova.c #include <stdio.h>
> #include <unistd.h>
>
> int
> main (int argc, char *argv[])
> {
> int cnt;
>
> for (cnt = 0; cnt < 10; cnt++ ) {
> printf ("ciao\n");
> sleep (1);
> }
> }
> ---
>
> Quando utilizzo la redirezione dello standard output su file, alla fine
> dell'esecuzione è tutto ok. ---
> [...]
>
> Se durante l'esecuzione premo Ctlr-C (quindi invio il segnale SIGINT al
> processo),
> ovviamente il programma termina, ma dati.txt risulta vuoto
> [...]
>
> Sembra che l'invio del segnale SIGINT non gestisca il flushing dei dati
> scritti su stdout
> quando c'è redirezione su un file.
Questo perchè l'azione di default di SIGINT è abortire il processo
(equivalente a chiamare _exit).
Inoltre la stdio quando l'output non va a finire su un terminale, applica
il buffering completo.
> Esiste qualche altro segnale che è possibile inviare per fare in modo
> che nel file d'uscita
> vengano scritti i messaggi su stdout fino al momento dell'interruzione?
No.
Leggiti la documentazione su come viene gestito il buffering nella stdio
e come vengono gestiti i segnali.
http://www.opengroup.org/onlinepubs/000095399/toc.htm
http://www.opengroup.org/onlinepubs/000095399/toc.htm
http://www.opengroup.org/onlinepubs/000095399/toc.htm
> [...]
Manlio Perillo
> [...]
> Leggiti la documentazione su come viene gestito il buffering nella stdio
> e come vengono gestiti i segnali.
> http://www.opengroup.org/onlinepubs/000095399/toc.htm
> http://www.opengroup.org/onlinepubs/000095399/toc.htm
> http://www.opengroup.org/onlinepubs/000095399/toc.htm
>
Ah, scusa link errati:
http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_05.html
http://www.opengroup.org/onlinepubs/009695399/functions/setvbuf.html
http://www.opengroup.org/onlinepubs/009695399/basedefs/signal.h.html
Manlio Perillo
Sì, la soluzione che ho trovato è intercettare SIGINT e uscire con
exit() che dovrebbe flushare tutti i file aperti.