Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

SIGINT e redirezione standard output

1 view
Skip to first unread message

pozz

unread,
Jul 8, 2008, 5:59:38 AM7/8/08
to
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.
---
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.

Manlio Perillo

unread,
Jul 8, 2008, 6:38:46 AM7/8/08
to
Il Tue, 08 Jul 2008 02:59:38 -0700, pozz ha scritto:

> 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

Manlio Perillo

unread,
Jul 8, 2008, 6:43:31 AM7/8/08
to

pozz

unread,
Jul 8, 2008, 5:57:07 PM7/8/08
to
Manlio Perillo ha scritto:

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

Sì, la soluzione che ho trovato è intercettare SIGINT e uscire con
exit() che dovrebbe flushare tutti i file aperti.

0 new messages