[Cascavel-pm] dúvida ao usar CGI::Carp

Luis Champs de Carvalho monsieur_champs em yahoo.com.br
Segunda Agosto 2 08:20:20 CDT 2004


On Mon, 2 Aug 2004, Alceu Rodrigues de Freitas Junior wrote:

> Olá monges,
>
> Alguém já fez uso de CGI::Carp para gerar mensagens decentes no log do
> Apache?

  É a quinta linha de qualquer programa perl que eu faço com padrão web.

  -----------
  $ head -n5 ~/src/*/bin/* | sort -u
  #!/usr/bin/perl
  use strict;
  use warnings;
  use diagnostics;
  use CGI::Carp qw/ fatalsToBrowser /;
  -----------

> Eu estava usando o módulo sem problemas até usar a pragma "use signals".
> Basicamente habilitei o CGI para chamar uma função ao receber um sinal
> TERM. A função faz alguma coisa e encerra com um "die".

  Você deve estar falando do pragma "sigtrap", já que eu não fui capaz de
encontrar um outro parecido... vamos ver mais...

====== From Perl Documentation on CPAN
The sigtrap pragma is a simple interface to installing signal handlers.
You can have it install one of two handlers supplied by sigtrap itself
(one which provides a Perl stack trace and one which simply die()s), or
alternately you can supply your own handler for it to install. It can be
told only to install a handler for signals which are either untrapped or
ignored. It has a couple of lists of signals to trap, plus you can supply
your own list of signals.
======

> Para minha surpresa, ao invés de mandar uma mensagem com timestamp e
> tudo o mais para o log do Apache, o CGI mandou apenas a mensagem do
> "die".

  Isso por que você deve estar instalado os handlers de sinal nesta ordem:

  -------
  use sigtrap qw( die );
  use CGI::Carp qw( fatalsToBrowser );
  -------

> Alguém saberia dizer por que isso ocorre? Eu testei mandar a função que
> captura o sinal TERM carregar o módulo CGI::Carp, mas o resultado é o
> mesmo.

  Simples: você está se esquecendo de que o perl não oferece um mecanismo
simples para lidar com "correntes" de signal handlers instalados para
lidar com um mesmo sinal. Quando você diz "use sigtrap" o que acontece é
que o módulo "invade" seu espaço (a seu convite, claro!) e instala um
signal handler para você. Lamentavelmente, quando você usa o "use
CGI::Carp", acontece novamente a mesma coisa, e não existe forma simples
de fazer com que um módulo saiba da existência do outro...

  Você precisa mesmo usar os dois?
  Acho que poderia ter outra forma de fazer, talvez sem usar o import()
dos módulos, mas algum mecanismo seu... assim:

  #!/usr/bin/perl
  # repare na lista vazia passada para os módulos:
  # isso garante que não haverá chamada ao método "import()".
  use sigtrap ();
  use CGI::Carp ();
  # Mais adiante, você deve escolher como lidar com os sinais, assim:
  use vars qw/ %SIG /;
  $SIG{__DIE__} = sub{
                       CGI::Carp::handler_adequado();
                       sigtrap::handler_adequado();
                     }; # Não esquece o ';' no final da linha,
                        # isto ainda é uma atribuição!
  # Continua...
  __END__

  Espero que isso ajude você.
  Penso que a grande "sacada" agora é descobrir ou implementar o handler
que melhor se adapte ao seu problema, usando as funcionalidades de um e de
outro módulo...

  Boa sorte, meu caro!
-- 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  Luis Campos de Carvalho is BSc in Comp Science,
  PerlMonk [SiteDocClan], Cascavel-pm Moderator,
  Unix Sys Admin && Certified Oracle DBA
  http://br.geocities.com/monsieur_champs/
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
PS: Sentimos sua falta no encontro social!





Mais detalhes sobre a lista de discussão Cascavel-pm