Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

tuer un thread perl

1 réponse
Avatar
Mildred
Bonsoir,

Je suis en train de développer un serveur (un peu comme WotMud.org -
http://wotmud.org - mais en perl). et acessible par telnet ...

J'ai deja bien avencé ... mais ma première version utilisait fork() qui
ne doit pas être disponible partout. De plus, ce n'était pas très bien
codé ...

Je recode donc mon serveur avec les thread perl ... Et lorsque je veux
quitter mon programme, il y a un thread qui reste bloqué. Et je dois
faire un Ctrl-C

ce thread bloque sur la fonction qui attend une connexion. De fait, si
je me connecte par telnet, le serveur peut quitter tranquillement ...
Voici la sub incriminée:

sub thread_connexion{
# [...]
my @threads_child = ();
my $i=0;
while($life){
#
# C'est ici que ca bloque. le || !$life ne change rien
#
if(my $client = $server->accept() || !$life){
last unless $life;
$client->autoflush(1);
$threads_child[$i] = new threads(\&$thread_child, $client);
# my $thread_child = new threads(\&$thread_child, $client);
# $thread_child->detach;
close $client;
$i++;
}
}
addlog("Stopping threads of client managers") if $debug;
unless($autoclean){
foreach my $thread (@threads_child){
$thread->join;
}
}
addlog("Stopping thread: Listening connexions") if $debug;
}

J'explique: pour notifier que le serveur se termine, j'utilise la
variable $life qui passe de 1 à 0.

Savez vous comment je pourrais quitter ce thread ...
Il y a bien sur la possibilité de faire `telnet localhost $port` mais ce
n'est pas très propre ...

Mildred

--
GnuPGP: http://mildred593.free.fr/gpg/gpg-key.asc
Jabber: mildred@jabber.org
MSN: mildred.msn@free.fr
Yahoo: mildred59300
AIM: mildred59300
ICQ: 137401065

1 réponse

Avatar
Jerome Quelin
Mildred wrote:
ma première version utilisait fork() qui ne doit pas être disponible
partout.
[...]
Je recode donc mon serveur avec les thread perl ...


Et tu crois qu'un perl threadé sera plus facile à trouver ?
Du fait que les threads en Perl ont un impact sur les perfs, les perls
disponibles sur unix sont souvent compilés sans les threads. Ceci n'est
bien sûr pas vrai pour Windows.
Tout dépend donc ton public visé...

ce thread bloque sur la fonction qui attend une connexion. De fait, si
je me connecte par telnet, le serveur peut quitter tranquillement ...
if(my $client = $server->accept() || !$life){


Solution : utiliser une socket non bloquante.
use Fcntl qw[ F_GETFL F_SETFL O_NONBLOCK ];
my $flags = fcntl($server, F_GETFL, 0);
fcntl($server, F_SETFL, $flags|O_NONBLOCK);

Le contrôle des erreurs, ainsi que la syncrhonisation supplémentaire
nécessaire (pour éviter que ton thread bouffe tout le cpu) est laissé
en exercice.

Jérôme
--