gratifiant > comp.os.* > comp.os.bsd

Xavier (20/11/2007, 22h06)
Bonjour,

Je viens poser ma question ici, parce que c'est plein de gens sympas,
que le code est déployé sous FreeBSD et surtout, surtout, que Nicolas
George ne sévit pas ici :-)

Traditionnellement, pour un fork on a trois cas possibles, -1, 0, ou N

C'est effectivement géré comme cela dans Net::Server :

================================================== ==========
sub run_dequeue {
my $self = shift;
my $pid = fork;

### trouble
if( not defined $pid ){
$self->fatal("Bad fork [$!]");

### parent
}elsif( $pid ){
$self->{server}->{children}->{$pid}->{status} = 'dequeue';

### child
}else{
$self->dequeue();
exit;
}
}
================================================== ==========

Si j'override cette méthode pour ne rien faire quand ça échoue, il faut
que je le signale au processus appelant, nc(1) en l'occurence.

Mais à ce moment, je suis dans le processus père, pas question de faire
un exit 1, ça tue le serveur. Et un return 1, ça suffit pas à renvoyer
cette valeur à l'appelant. Le code est bien foutu, c'est une queue à
états, je PEUX ignorer l'échec de fork. Mais comment le faire savoir à
l'appelant qui, lui va renvoyer un EX_TEMPFAIL ad-hoc à son propre
appelant.

En C++, ça se règle d'un coup de try/catch, mais en Perl, je vois pas...

Je suis bien embêté. Si quelqu'un a une idée ?

Merci,
Marc Espie (20/11/2007, 23h16)
In article <1i7w9zi.1azr74s8qdtveN%xavier>,
Xavier <xavier> wrote:
>En C++, ça se règle d'un coup de try/catch, mais en Perl, je vois pas...
>Je suis bien embêté. Si quelqu'un a une idée ?


T'as des exceptions en perl aussi, hein, ca s'appelle eval { die }

Si ton perl est recent, tu peux meme passer une reference au lieu d'une
chaine a die. C'est explique dans perldoc -f die.
Xavier (21/11/2007, 02h35)
Marc Espie <espie> wrote:

> T'as des exceptions en perl aussi, hein, ca s'appelle eval { die }
> Si ton perl est recent, tu peux meme passer une reference au lieu d'une
> chaine a die. C'est explique dans perldoc -f die.


Ah, effectivement. Mais de toutes façons, mon main ne contient que

================================================== =====================
package MyPackage;
use strict;
use vars qw(@ISA);
use Net::Server::PreFork; # any personality will do
@ISA = qw(Net::Server::PreFork );
MyPackage->run(conf_file => "/Development/Socketserver/netserver.conf");
exit;
================================================== =====================

et est appelé tout bêtement par "echo $$ | nc localhost $PORT"

Charge aux sous-routines d'aller chercher les fichiers whetever.pid

Je ne vois pas de façon simple de récupérer d'un can't fork; ou tout
autre erreur fatale

Comme ce serveur va servir dans un système de mail, je DOIS retourner
EX_OK, EX_TEMPFAIL ou EX_UNAVAILABLE. EX_OSERR à la rigueur...

La solution crade serait, comme j'envoie le PID du script shell appelant
au serveur, de lui faire écrire son code de retour dans un fichier
retval.pid

Ou bien, je laisse le serveur mourir, et je le relance si nc(1) échoue.
Moauis... c'est peut-être mieux.

Vu comment fonctionne nc, je ne vois pas comment faire autrement, en
fait...

Merci,

PS : et non, je ne fais pas ch**r à réinventer amavis, j'ai d'autres
besoins, en plus de ceux couverts par amavis :-)
Discussions similaires