Newsgroup: it.comp.lang.perl
Titolo: problema codice

questo è il codice:
[code]
$s->listen();
while (1)
{
   $client = $s->accept();
   if ($client)
   {
      syswrite $client, $dati...
      close $client;
   }
 
}
[/code]
Se lo richiamo da browser inizia il trasferimento di dati da server a 
client...ma se dal browser interrompo il trasferimento si stoppa anche 
lo script (e tocca riavviarlo) ... perchè lo script si ferma?
Qualche idea?
Grazie

 wrote:

PERCHE'?????
Non c'è motivo...lo script finisce in modo pulito senza nessun 
errore...com'è possibile non controllare una situazione del genere?

 errore...com'č possibile non controllare una situazione del genere?
mi hanno detto che potrei evitarlo con sig pipe...ma non so come si 
usa...

 PERCHE'?????

 $SIG{PIPE} = 'IGNORE';
Ciao.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

  $SIG{PIPE} = 'IGNORE';
grazie per avermi risposto almeno tu...
$SIG{PIPE} = 'IGNORE'; non funziona!!!!!!!!
provalo tu stesso...ricopia il codice del mio primo post...
PROPRIO NON CAPISCO PERCHE'!!!!!

 wrote:

avevo anche provato cosi':
SERVER: while ($client = $socket->accept)
{
#
}
END {
print "errore...\n";
goto SERVER;
}
ma non funziona cmq...(tuttavia mi scrive "errore...")

 >  $SIG{PIPE} = 'IGNORE';




Mi dispiace ma non so cosa altro possa essere.
Ora sono a casa e posso fare solo prove in localhost.
Non conoscendo il modulo che usi ho preso l' esempio
monoprocesso in perldoc perlipc che usa il tuo
modulo e provato a modificarlo, ma su linux i risultati
sono quelli previsti. pero' in localhost non sono riuscito
a stroncare la connessione durante syswrite(), comunque
a me sembra un effetto imprevedibile e non giustificato.
che ci sia un' altro signal? o sulla tua piattaforma
l' interprete e' stato compilato con qualche flag strano??
Se togli -w all' interprete che succede?
Mi dispiace ma non so'
Ciao
Roberto


 Roberto
come intercetto il segnale!!!!!!!

 come intercetto il segnale!!!!!!!
puoi provare a mettere tutto l' hash %SIG
a IGNORE
@nomi = keys(%SIG);
for my $nomesig (@nomi) {$SIG{$nomesig} = 'IGNORE';}
ma poi il processo come lo ammazzi? Control-C non funziona
piu'. Su Linux solo kill -9 lo fermera'.
Una cosa non ti ho detto sui segnal: all' handler verra'
passato il numero di segnale arrivato quindi lo stesso
handler puo' essere installato su piu' segnali, che sapra'
riconoscere da $_[0].
quindi invece di 'IGNORE' puoi mettere:
sub handleruniversale
{
  print "\nricevuto segnale $_[0]\n";
  $SIG{$_[0]} = \&handleruniversale;
      # alcuni sys reinstallano handler di default
      # quindi noi reistalliamo il nostro comunque
}
@nomi = keys(%SIG);
for my $nomesig (@nomi) {$SIG{$nomesig} = \&handleruniversale;}
cosi' a console tracci la ricezione dei segnali.
Per curiosita' (visto che non usi linux).
prova a sostituire syswrite() con write o print,
magari settando $| = 1 per output non bufferizzato.
Syswrite e' ottima per chi usa unix, ma l' interprete
perl usa quella del sistema sottostante. le altre sono
riscritte e sono piu' portabili.
In UNIX/Linux la read() e la write() (perl sysread e syswrite)
sono bloccanti, (ci sarebbe altro da dire..) ma interrompibili
da signal(). SIGPIPE quindi, anche se lo intercetti ti sblocca
la syswrite che comunque su Linux ritorna errore e setta errno
a EPIPE, quindi si tornerebbe al ciclo while(1). Non vorrei che
le specifiche per il tuo sistema sia l' abort del processo...
Quindi come prima prova eliminiamo i tools non portabili tra
sistemi, poi fai sapere.
ciao
Roberto.


 cosi' a console tracci la ricezione dei segnali.
HAI VINTO!!!!!!!!!!!!!!!!
era:
local $SIG{NUM13} = 'IGNORE';
ma che roba č?
(per la cronaca io sono su MacOS9 + MacPerl5)
grazie mille!!!!!

 grazie mille!!!!!
Prego!!
da man 7 signal (sotto Linux:)
Signal     Value     Action   Comment
-------------------------------------
...
SIGPIPE      13       Term    Broken pipe: write to pipe with no readers
...
quindi era proprio lui, ma dovrebbe essere ANCHE referenziabile
con PIPE. (prova a vedere la lista di tutti i nomi di keys(%SIG)
se trovi anche PIPE). Su Linux SIG13 non c' e' con quel nome
(ne' alla manpage ne' nell' hash di perl 5.8.4).
Prova a segnalarlo ai produttori di MacPerl5.
Ciao.


  se trovi anche PIPE).
NUM13
NUM30
NUM22
NUM31
NUM23
ALRM
NUM16
NUM25
NUM17
NUM26
NUM18
NUM27
NUM19
ILL
NUM28
NUM29
SEGV
NUM1
NUM3
NUM5
NUM6
NUM7
INT
NUM9
HUP
TERM
NUM10
FPE
NUM11
NUM20
NUM12
PIPI non c'č...cmq per me problema risolto!