Discussion:
Net::TFTPd
(for gammel til at besvare)
Thomas Elsgaard
2011-03-18 20:53:37 UTC
Permalink
Hej!

Sidder og kigger lidt på et projekt hvor jeg skal bruge en TFTP server
som integrerer ind i noget perl, overvejer jeg at bruge Net::TFTPd, og
umiddelbart er den ufattelig simpel:

#Code start
use Net::TFTPd;

my $tftpdOBJ = Net::TFTPd->new('RootDir' => '/Users/Thomas/','Timeout' => 60)
or die "Error creating TFTPd listener: %s", Net::TFTPd->error;

my $tftpRQ = $tftpdOBJ->waitRQ(10)
or die "Error waiting for TFTP request: %s", Net::TFTPd->error;

$tftpRQ->processRQ()
or die "Error processing TFTP request: %s", Net::TFTPd->error;
#Code END

Men når jeg læser på hvad der står om waitRQ metoden:

When the method returns, the program should fork() and process the
request invoking processRQ() while the parent process should re-start
waiting for another request.

Så bliver jeg sådan lidt: hmmm skal jeg så have mit script til at
står og genstarte efter hver connection , og ellers hver 10 sekund
(waitRQ (10)), hvordan pokker laver man det pænt? Min første tanke var
at smide det ind i /etc/inittab ... men såvidt jeg husker, så hvis en
process genstarter for hurtigt, så bliver den sat lidt på hold, men
jeg kan jo nemt risikerer at TFTP serveren modtager en del request, så
vil jeg jo ikke have den i karantæne ;-)

Nogen gode ideer?

Thomas
Ask Bjørn Hansen
2011-03-18 21:06:52 UTC
Permalink
Post by Thomas Elsgaard
my $tftpRQ = $tftpdOBJ->waitRQ(10)
or die "Error waiting for TFTP request: %s", Net::TFTPd->error;
$tftpRQ->processRQ()
or die "Error processing TFTP request: %s", Net::TFTPd->error;
Burde nok være:

while (1) {

if (my $tftpRQ = $tftpdOBJ->waitRQ(10)) {
if (fork) {
# parent
next;
}
else {
# child, processing the request
$tftpRQ->processRQ()
or die "Error processing TFTP request: %s", Net::TFTPd->error;
}
}
else {
say "Jeg keder mig..."
}
}
Post by Thomas Elsgaard
When the method returns, the program should fork() and process the
request invoking processRQ() while the parent process should re-start
waiting for another request.
Jeg tror han med "restart" bare mener "start forfra i loop'et".



- ask
Thomas Elsgaard
2011-03-19 00:23:22 UTC
Permalink
Post by Ask Bjørn Hansen
while (1) {
   if (my $tftpRQ = $tftpdOBJ->waitRQ(10)) {
     if (fork) {
        # parent
        next;
     }
     else {
         # child, processing the request
         $tftpRQ->processRQ()
             or die "Error processing TFTP request: %s", Net::TFTPd->error;
       }
   }
   else {
       say "Jeg keder mig..."
   }
}
Post by Thomas Elsgaard
When the method returns, the program should fork() and process the
request invoking processRQ() while the parent process should re-start
waiting for another request.
Jeg tror han med "restart" bare mener "start forfra i loop'et".
Hej Ask

1000 tak for hjælpen, jeg måtte lige ligge en waitpid ind, men ellers
lige i øjet!! Første gang jeg har arbejdet med fork, så det skulle jeg
lige have på plads! Fortsat god weekend!

Thomas
Peter Makholm
2011-03-19 10:31:58 UTC
Permalink
Post by Thomas Elsgaard
1000 tak for hjælpen, jeg måtte lige ligge en waitpid ind, men ellers
lige i øjet!! Første gang jeg har arbejdet med fork, så det skulle jeg
lige have på plads! Fortsat god weekend!
For at undgå zombie-processer, ikke?

Du kan også bare indsætte '$SIG{CHLD} = "IGNORE"' inden løkken, så
bliver færdige child-processer automatisk håndteret. Søg efter CHLD i
perlipc dokumentationen.

//Makholm
Thomas Elsgaard
2011-03-19 22:46:57 UTC
Permalink
Post by Peter Makholm
For at undgå zombie-processer, ikke?
Du kan også bare indsætte '$SIG{CHLD} = "IGNORE"' inden løkken, så
bliver færdige child-processer automatisk håndteret. Søg efter CHLD i
perlipc dokumentationen.
//Makholm
Hej Peter

Jo lige præcis, og det virker også udemærket med $SIG{CHLD} = 'IGNORE';

Tak for hintet

///Thomas

Loading...