[Perl] Probleme de fork & serveur socket

Probleme de fork & serveur socket [Perl] - Perl - Programmation

Marsh Posté le 11-02-2005 à 12:26:29    

dans un livre (sur perl, logique), je suis tombé sur cet exemple :
 

Code :
  1. #!/usr/bin/perl
  2. use Socket;
  3. socket(Serveur, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
  4. setsockopt(Serveur, SOL_SOCKET, SO_REUSEADDR, 1);
  5. my $mon_adr = sockaddr_in(10, INADDR_ANY);
  6. bind(Serveur, $mon_adr) or die "N'a pas pu s'attacher au port 10 : $!";
  7. listen(Serveur, SOMAXCONN) or die "N'a pas pu ecouter au port 10 : $!";
  8. REQUETE:
  9.     while (accept(Client, Serveur)) {
  10.        if($pid_fils = fork) {
  11.             close Client;
  12.             next REQUETE;
  13.         }
  14.         defined($pid_fils) or die "fork impossible : $!";
  15.         close Serveur;
  16.         select(Client);
  17.         $| = 1;
  18.         my $entree = <Client>;
  19.         print Client "Affichage\n";
  20.         open(STDIN, "<<&Client" ) or die "impossible de dupliquer le client 1 : $!";
  21.         open(STDOUT, ">&Client" ) or die "impossible de dupliquer le client 2 : $!";
  22.         open(STDERR, ">&Client" ) or die "impossible de dupliquer le client 3 : $!";
  23.         system("bc -l" );
  24.         print "fini\n";
  25.         close Client;
  26.         exit;
  27.     }


j'ai donc supposé qu'il était complet et j'ai à peu pres compris le programme, mais  j'en doute car lors de la connexion à ce programme (via socket en telnet), j'ai cette erreur dans la console où j'ai lancé ce programme et ca kill la connexion telnet :

impossible de dupliquer le client 1 : Aucun fichier ou répertoire de ce type at fork.pl line 21, <Client> line 1.


 
Vous auriez une idée sur la cause et comment le résoudre ?


---------------
"Deux chose sont infinies, l'univers et la sotise humaine. Mais je ne suis pas sûr de ce j'affirme quant à l'univers." Albert Einstein
Reply

Marsh Posté le 11-02-2005 à 12:26:29   

Reply

Marsh Posté le 11-02-2005 à 19:47:33    

sharlaan a écrit :


        open(STDIN, "<<&Client" ) or die "impossible de dupliquer le client 1 : $!";


 
open(STDIN, "<&Client" ) or die "impossible de dupliquer le client 1 : $!";
 
essaie comme ca.

Reply

Marsh Posté le 12-02-2005 à 16:43:12    

merci, ca marche


---------------
"Deux chose sont infinies, l'univers et la sotise humaine. Mais je ne suis pas sûr de ce j'affirme quant à l'univers." Albert Einstein
Reply

Marsh Posté le 13-02-2005 à 01:02:19    

par contre j'ai un probleme, lorsque je ferme la connexion sur un client, il reste encore un process qui traine :

Code :
  1. sharlaan     22496  0.0  0.0     0    0 pts/7    Z+   00:10   0:00 [perl] <defunct>


 
il y'a un truc qui manque dans mon script ?


Message édité par sharlaan le 13-02-2005 à 01:02:34

---------------
"Deux chose sont infinies, l'univers et la sotise humaine. Mais je ne suis pas sûr de ce j'affirme quant à l'univers." Albert Einstein
Reply

Marsh Posté le 13-02-2005 à 19:13:24    

sharlaan a écrit :

par contre j'ai un probleme, lorsque je ferme la connexion sur un client, il reste encore un process qui traine :

Code :
  1. sharlaan     22496  0.0  0.0     0    0 pts/7    Z+   00:10   0:00 [perl] <defunct>


 
il y'a un truc qui manque dans mon script ?


 
oui, il manque le nettoyage des zombies
 
lis ca:
http://www.india-seo.com/perl/cookbook/ch16_20.htm


Message édité par djtoz le 13-02-2005 à 19:15:05
Reply

Marsh Posté le 13-02-2005 à 22:16:00    

merci


---------------
"Deux chose sont infinies, l'univers et la sotise humaine. Mais je ne suis pas sûr de ce j'affirme quant à l'univers." Albert Einstein
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed