Eh bien, c'est mieux si vous pouviez dire ce que ce démon est supposé faire. Comme il existe des cadres/bibliothèques spécialisés pour diverses tâches.
Pour le démon simple qui ne fait rien, il existe juste, vous pouvez le faire facilement:
#!/usr/bin/perl
use strict;
use warnings;
use Carp;
use POSIX qw(setsid);
daemonize();
do_your_daemon_stuff();
exit;
sub daemonize {
chdir '/' or croak "Can't chdir to /: $!";
open STDIN, '/dev/null' or croak "Can't read /dev/null: $!";
open STDOUT, '>/dev/null' or croak "Can't write to /dev/null: $!";
defined(my $pid = fork) or croak "Can't fork: $!";
exit if $pid;
setsid or croak "Can't start a new session: $!";
open STDERR, '>&STDOUT' or croak "Can't dup stdout: $!";
}
sous daemonize() a été LIFTEN de perldoc perlipc (avec changement mineur).
C'est tout - le code est maintenant correctement démonisé et peut faire tout ce que vous voulez.
Je viens de lire votre édition, que vous voulez un serveur TCP.
OK. Voici le code simpliste:
#!/usr/bin/perl
use strict;
use warnings;
use Carp;
use POSIX qw(setsid);
use IO::Socket;
my $server_port = get_server_port();
daemonize();
handle_connections($server_port);
exit;
sub daemonize {
chdir '/' or croak "Can't chdir to /: $!";
open STDIN, '/dev/null' or croak "Can't read /dev/null: $!";
open STDOUT, '>/dev/null' or croak "Can't write to /dev/null: $!";
defined(my $pid = fork) or croak "Can't fork: $!";
exit if $pid;
setsid or croak "Can't start a new session: $!";
open STDERR, '>&STDOUT' or croak "Can't dup stdout: $!";
}
sub get_server_port {
my $server = IO::Socket::INET->new(
'Proto' => 'tcp',
'LocalPort' => 31236,
'Listen' => SOMAXCONN,
'Reuse' => 1,
);
die "can't setup server" unless $server;
return $server;
}
sub handle_connections {
my $port = shift;
my $handled = 0;
while (my $client = $port->accept()) {
$handled++;
print $client "Hi, you're client #$handled\n";
chomp (my $input = <$client>);
my $output = reverse $input;
print $client $output, "\n";
print $client "Bye, bye.\n";
close $client;
}
return;
}
Rappelez-vous simplement que ce bloque serveur tcp, il sera en mesure de gérer 1 connexion à l'époque. Si vous voulez plus de 1 - cela devient plus complexe, et vous devez vous demander si vous préférez le multithreading (ou le multi-traitement), ou si vous préférez un serveur basé sur les événements à un seul processus.
Quel type de serveur? Il existe des modules pour implémenter des serveurs HTTP, des serveurs SMTP, ... – cjm
Un simple démon de serveur TCP. – someguy
en double de http://stackoverflow.com/questions/766397 –