<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">2014-05-26 12:57 GMT+02:00 Enrico Bianchi <span dir="ltr"><<a href="mailto:enrico.bianchi@ymail.com" target="_blank">enrico.bianchi@ymail.com</a>></span>:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Ultimamente mi sto scontrando cone le idiosincrasie di Windows senza trovare una via di uscita. Prendiamo in esame il seguente codice:<br>

<br></blockquote><div>> [...] </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
Il codice non e` altri che un normale echo server, che apre il suo socket e si mette in ascolto delle richieste dei client. Il problema e` che che su ambienti *nix (o meglio, su Linux, visto che non ho altri sistemi *nix su cui provare ;) ) non solo funziona bene, ma basta un CTRL + C (SIGINT) per terminare il processo ed avere di nuovo la shell libera. Su Windows pero` a quanto pare non funziona, </blockquote>
<div><br></div><div>Il problema è che su Windows i segnali sono implementati in modo completamente diverso.  In particolare non sono gestiti dal kernel (che ha il controllo su come/quando gira un processo in user space).</div>
<div><br></div><div>Su un sistema UNIX quando premi Ctrl-C, la shell invia il segnale SIGING al programma in foreground.  Tale segnale viene gestito dal kernel, che sospende l'esecuzione del programma ed esegue il signal handler, se presente.</div>
<div><br></div><div>Riguardo Windows, leggi la nota riguardo SIGINT su</div><div><a href="http://msdn.microsoft.com/en-us/library/xdkz3x12.aspx">http://msdn.microsoft.com/en-us/library/xdkz3x12.aspx</a><br></div><div><br>
</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">ovvero l'unico modo per fermare il processo e` killandolo brutalmente, cosa non sempre fattibile (e.g. se faccio girare l'echo server come servizio non posso fermarlo dalla schermata dei servizi). C'e` un modo per aggirare questa cosa che non sia "abbandona Windows"? :)<br>

<br></blockquote><div><br></div><div>Si, ed è quello di replicare quello che succede su un sistema UNIX.</div><div>Questo significa eseguire un thread separato che si occupa di intercettare degli "eventi" speciali, come la pressione dei tasti Ctrl + C, e terminare l'applicazione.  Ma non ho idea se la cosa funzioni, ne dei vari dettagli.</div>
<div><br></div><div>Da una veloce ricerca è uscito fuori questo:</div><div><a href="http://stanislavs.org/stopping-command-line-applications-programatically-with-ctrl-c-events-from-net/">http://stanislavs.org/stopping-command-line-applications-programatically-with-ctrl-c-events-from-net/</a><br>
</div><div><br></div><div></div></div><br></div><div class="gmail_extra">Ciao  Manlio</div></div>