Newsgroup: it.comp.lang.c
Titolo: Aiuto: Come evitare la terminazione forzata di un processo C.G.I.

Saluti a tutti,
grazie in anticipo per la vostra attenzione.
Sto sviluppando un gestore di posta elettronica via WWW tramite C.G.I.
Non riesco a risolvere questo problema:
-) Supponiamo che il processo C.G.I. possa avere un tempo di esecuzione di 
diversi minuti.
-) Un utente web manda in esecuzione tale processo C.G.I. dal proprio browser
-) senza attendere la naturale terminazione del processo, l'utente preme il 
bottone "STOP" sul browser
-) a questo punto, il web-server (Apache) termina il processo, in un momento 
qualunque della sua esecuzione.
Il problema e' che il programma, durante la sua esecuzione, scrive in alcuni 
file: se il processo viene interrotto in questo modo totalmente asincrono, i 
files aperti in scrittura risulteranno inevitabilmente corrotti. :-(
Questa interruzione forzata  si presenta anche quando l'utente, senza 
attendere la naturale terminazione del processo, preme "RELOAD" oppure 
ri-sottomette il form dal browser.
Non sono a conoscenza di un metodo per gestire questo evento, che, se non 
sbaglio, dovrebbe essere un segnale SIGKILL mandato dal web-server al processo 
C.G.I in esecuzione.
In altre parole:
come e' possibile essere assolutamente certi che un programma C.G.I. in 
esecuzione, una volta avviato, non venga in alcun modo interrotto ?
Ancora in altre parole:
supponendo che la terminazione del processo avvenga tramite un segnale 
SIGKILL, come e' possible, se e' possibile, gestire questo segnale ?
P.S.
poiche' ho postato questo messaggio in newsgroups diversi, e' possibile che io 
non legga la risposta se questa viene postata direttamente nel newsgroup: per 
risposte a questo messaggio scrivere a 
g...@gpstudio.com
.
Grazie ancora.
Spero di poter essere utile in futuro.
Chiunque lo desideri puo' contattarmi a:
g...@gpstudio.com
Giacomo Picconi
GP Studio Internet Services
Via Cavaleri 4/a, Milano, Italy
Tel. +39-2-40072733

 SIGKILL, come e' possible, se e' possibile, gestire questo segnale ?
se la segnal che vuoi gestite e' SIGKILL puoi ignorare il segnale:
signal(SIGKILL,SIG_IGN);
pero' dopo non potrai piu' interrompere il prog prima della sua fine.
oppure:
signal(SIGKILL,mia_fun);
dove mia_fun e' il nuovo gestore della signal e li puoi fare quello che
meglio credi.
Queste sono le cose di base poi leggi le man page perche' ogni sistema
ha le sue particolarita'.
Ciao.
-- 
     (ZZZ)       Filippo Salotti, Bagni di Lucca, Lucca, Italy.
    //   \\  _                 E-mail : 
fil...@humnet.unipi.it
   /Y\    ZD<_o===============================================o
 .oZZZZZo.     | Studente Ingegneria Informatica Automatica  |
<OXXXXXXXO>    | Dip. Sistemi Elettrici Universita' di Pisa. |

signal(SIGKILL,SIG_IGN);
Ribadisco: *NON E` VERO*!!!  Non su nessuno Unix standard,
per lo meno.  man 2 signal (su di un Digital Unix su Alpha, ad
esempio), dice:
void (*signal (
          int sig,
          void (*function) (int))) (int);
PARAMETERS
  sig       Defines the signal.  All signals are valid with the
exception of
            SIGKILL and SIGSTOP.
Nota: *CON L'ECCEZIONE DI SIGKILL" (e SIGSTOP). ***NON*** puoi
intercettare SIGKILL in un qualsiasi Unix standard!!! Il fatto di non
essere
intercettabile e` la *ragion d'essere* di SIGKILL, l'unico motivo per
esso
di *esistere* come qualcosa di distinto da SIGTERM!
Alex

 C.G.I in esecuzione.
Alex Mertelli, su questo stesso thread, ha già detto di SIGKILL.
Aggiungo solo che il web server (Apache, con il quale non ho mai
lavorato) *potrebbe* implementare un timeout, allo scadere del quale
invia un SIGKILL (ma non sarebbe più sensato un SIGTERM?) al CGI... ma
allora non ci dovrebbe essere nessuna relazione con il fatto che il
client si sia disconnesso o meno.
In attesa di ulteriori dettagli,
-julio di egidio
ju...@webzone.it

 Alex Mertelli, su questo stesso thread, ha già detto di SIGKILL.
Pardon, doveva essere Alex Martelli.
-julio di egidio
ju...@webzone.it