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

Terminer un fils dans le cas de SOCKET AFINET

1 réponse
Avatar
Erol
Bonjour,
Je suis en train de modifier un code qui fonctionne mais qui ne
medonne pas encore satisfaction.
Le code de ce serveur cr=E9e 2 fils afin de r=E9ponde en Lecture &
Ecriture aux fils avec qui il communique.
Le probleme est que si le fils termine brutalement pour une raison ou
une autre en cours
de discussion, le serveur laisse les 2 fils actifs en m=E9moire... et
cela arrive souvent dans mon cas.

Est-il possible de forcer la fermeture du processus si il n'y a pas de
discussion au bout de 10minutes par exemple... MErci pour vos lumi=E8res
--------------------------------------------------------------------
$server =3D IO::Socket::INET->new(
LocalPort =3D> 3500,
Type =3D> SOCK_STREAM,
Reuse =3D> 1,
Listen =3D> 5
) or die "Cr=E9ation du serveur impossible.\n";
print "D=E9marrage du serveur ..\n";

while ($client =3D $server->accept()) {

print $client "Le serveur dit 'bonjour' au client !\n";

$pid =3D fork; # dans le p=EAre on fork()
die "Je ne peux pas forker !" if ! defined ($pid); # si le fork
echoue
if ($pid =3D=3D 0) { # on est dans le fils qui =E9coute le client

# on cree un 2eme fils
$pid_fils =3D fork ();
if ($pid_fils =3D=3D 0) { # on est dans le petit fils qui =E9crit pour le
client
# print "Petit fils 1 : ".$pid_fils."\n";
# c'est le processus enfant, charg=E9 de l'=E9coute des clients

while ($ligne =3D <$client> ) {
print "client> $ligne";
$chaine =3D $ligne;
# traitements divers
} # fin du while
} else {
# c'est le p=E8re qui pendant ce temps r=E9pond au client #
while ($ligne =3D <>) {
print $client $ligne;
}
} # fin if ($pid_fils =3D=3D 0)
# } else {
# print "Pere : Ecoute\n";

} # fin if ($pid =3D=3D 0) { # on est dans le fils qui =E9coute le client
} #fin while ($client =3D $server->accept())


Merci de vos lumi=E8res
Erol

1 réponse

Avatar
Paul Gaborit
À (at) Tue, 19 Jun 2007 08:35:26 -0700,
Erol écrivait (wrote):
Bonjour,
Je suis en train de modifier un code qui fonctionne mais qui ne
medonne pas encore satisfaction.
Le code de ce serveur crée 2 fils afin de réponde en Lecture &
Ecriture aux fils avec qui il communique.
~~~~~~~~~

aux clients (?)
Le probleme est que si le fils termine brutalement pour une raison ou
une autre en cours
de discussion, le serveur laisse les 2 fils actifs en mémoire... et
cela arrive souvent dans mon cas.


Si le fils meurt, il ne peut rester que le petit-fils... non ?

En fait, je n'ai pas vraiment compris l'architecture de votre système.

Est-il possible de forcer la fermeture du processus si il n'y a pas de
discussion au bout de 10minutes par exemple...


Je pense que l'utilisation de 'select' doit répondre à votre
besoin. Pour en savoir plus :

perldoc -f select

ou (en français) :

<http://perl.enstimac.fr/DocFr/perlfunc.html#item_select>

Lire la deuxième partie (celle qui parle de l'appel système
'select(2)').

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>