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

Alceu Rodrigues de Freitas Junior glasswalk3r em yahoo.com.br
Segunda Agosto 2 18:17:23 CDT 2004


On Mon, 2 Aug 2004 10:20:20 -0300 (BRT) Luis Champs de Carvalho
<monsieur_champs em yahoo.com.br> wrote:

> On Mon, 2 Aug 2004, Alceu Rodrigues de Freitas Junior wrote:
> > 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...

é verdade, desculpe:
use sigtrap 'handler' => \&terminated, 'normal-signals';

Isto é exatamente o que estou usando.
 
> > 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 );
>   -------

Na verdade não, isso é a parte confusa da história. Segue a "salada":
use CGI;
use warnings;
use strict;
use CGI::Carp;
use LWP 5.66;
use URI::Split qw (uri_split);
use sigtrap 'handler' => \&terminated, 'normal-signals';
use Digest::MD5 qw(md5_base64);
use IPC::Open3;
 
> > 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...

Mas quando eu solicito que eles invadam o "espaço" do programa, esse
espaço não é compartilhado pelos dois módulos? Isso me deixou meio
confuso, já que nunca tive esse tipo de problema, até o momento.
 
>   Você precisa mesmo usar os dois?

Ah, sim. Isso me ajuda muito. Eu resolvi desta forma:

sub terminated {

    my $date = localtime(time);
    die "[$date] viralator.cgi:warning: request process killed by
$client\n";

}

Isso faz exatamente o que o CGI::Carp faria por mim. Mas estou
duplicando o código, algo indesejável.

>   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 ();

Mas os métodos são acessíveis do mesmo jeito, certo? Eu nunca especifico
o que quero usar com o módulo CGI.pm, por exemplo. Eu simplesmente uso:
use CGI;

>   # 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__

Acho que nesse caso, usar a pragma sigtrap não me ajuda nada... afinal
ou que eu procuro são apelidos para os sinais.
 
>   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...

Na verdade, eu ainda estou bastante confuso do porque disso não ter
funcionado.

[]'s


-- 
Alceu Rodrigues de Freitas Junior
--
glasswalk3r em yahoo.com.br
PGP public key at http://www.imortais.cjb.net/addgb.html
---------------------------------------------------------------
He who knows others is wise.
He who knows himself is enlightened.
                -- Lao Tsu
 



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