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

Probleme avec fork() et Socket ?

1 réponse
Avatar
pbouige
Bonjour,

Un petit problème de "fork".... J'ai un programme qui tourne
sur une debian/linux avec perl :
"This is perl, v5.6.1 built for i686-linux"
le programme ci-dessous (un extrait j'ai retiré tout ce qui
ne servait à rien) fonctionne sans problème depuis de nombreux
mois(c'est largement inspiré de la doc Perl).

Je réinstalle une nouvelle machine (debian/linux/knoppix) avec
une nouvelle version de perl :
"This is perl, v5.8.0 built for i386-linux-thread-multi"
et la ... plus rien ne fonctionne ... message d'erreur suivant :

Can't call method "autoflush" on an undefined value at ..... line 61

Le problème provient de Perl ? si oui comment le résoudre ?

Merci d'avance pour ce grand coup de main :-)

Philippe

######################################################################
#!/usr/bin/perl -w

use strict;
use IO::Socket;
use Net::hostent;
use POSIX qw(:sys_wait_h);

my ($PORT) = 9000;

## les terminateurs
my ($EOL) = "\015\012";
my ($FIN) = $EOL x 2;

sub REAP {
1 until ( -1 == waitpid( -1, WNOHANG) );
$SIG{CHLD} = \&REAP;
}

$SIG{CHLD} = \&REAP;

my ($server) = IO::Socket::INET->new( Proto => 'tcp',
LocalPort => $PORT,
Listen => 5,
Reuse => 1);

die "can't setup server" unless $server;

STDOUT->autoflush(1);

......................................................

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

$client->autoflush(1);
## separation PERE et FILS
#########################
next if $pid = fork();

print .....
close $server; ## On ferme le serveur du FILS

while ( $ligne = <$client> ) {
if ( $ligne eq...){
..... ## je fais des trucs ;-))
}
}
.....
exit; ## FIN DU FILS
} continue
{
close $client;
}

1 réponse

Avatar
Alain BARBET
Philippe Bouige wrote:
Bonjour,

Un petit problème de "fork".... J'ai un programme qui tourne
sur une debian/linux avec perl :
"This is perl, v5.6.1 built for i686-linux"
le programme ci-dessous (un extrait j'ai retiré tout ce qui
ne servait à rien) fonctionne sans problème depuis de nombreux
mois(c'est largement inspiré de la doc Perl).

Je réinstalle une nouvelle machine (debian/linux/knoppix) avec
une nouvelle version de perl :
"This is perl, v5.8.0 built for i386-linux-thread-multi"
et la ... plus rien ne fonctionne ... message d'erreur suivant :

Can't call method "autoflush" on an undefined value at ..... line 61

Le problème provient de Perl ? si oui comment le résoudre ?

Merci d'avance pour ce grand coup de main :-)

Philippe

######################################################################
#!/usr/bin/perl -w

use strict;
use IO::Socket;
use Net::hostent;
use POSIX qw(:sys_wait_h);

my ($PORT) = 9000;

## les terminateurs
my ($EOL) = "1512";
my ($FIN) = $EOL x 2;

sub REAP {
1 until ( -1 == waitpid( -1, WNOHANG) );
$SIG{CHLD} = &REAP;
}

$SIG{CHLD} = &REAP;

my ($server) = IO::Socket::INET->new( Proto => 'tcp',
LocalPort => $PORT,
Listen => 5,
Reuse => 1);

die "can't setup server" unless $server;

STDOUT->autoflush(1);

......................................................

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

$client->autoflush(1);
## separation PERE et FILS
#########################
next if $pid = fork();

print .....
close $server; ## On ferme le serveur du FILS

while ( $ligne = <$client> ) {
if ( $ligne eq...){
..... ## je fais des trucs ;-))
}
}
.....
exit; ## FIN DU FILS
} continue
{
close $client;
}


J'ai bien une idée ... mais tu d'abord me dire comment ce code passe chez toi ???

saturne:~$ perl /tmp/t.pl
Global symbol "$client" requires explicit package name at /tmp/t.pl line 30.
Global symbol "$client" requires explicit package name at /tmp/t.pl line 32.
Global symbol "$pid" requires explicit package name at /tmp/t.pl line 35.
Global symbol "$ligne" requires explicit package name at /tmp/t.pl line 38.
Global symbol "$client" requires explicit package name at /tmp/t.pl line 38.
Global symbol "$client" requires explicit package name at /tmp/t.pl line 44.
Execution of /tmp/t.pl aborted due to compilation errors.

et les '...' dans le code c'est pas une bonne idée !

Sinon ... STDOUT->autoflush(1) se remplace par
$| = 1; # ou bien
$AUTOFLUSH = 1; # ou bien
use IO::Handle; # from perldoc IO::Handle
autoflush STDOUT 1;

--
Alain