[AsteriskBrasil] Script AGI em C

cleviton.araujo@caixa.gov.br cleviton.araujo em caixa.gov.br
Segunda Maio 22 09:59:28 BRT 2006


Pessoal:

Usei aquele exemplo de script AGI em C da web, só para perceber o funcionamento com o Asterisk. Compilei e funcionou beleza.
Executando um ls -l acidental no diretório onde estava o fonte e executável fiquei supreendido que o executável ficou com o tamanho mais de 20 vezes maior que o fonte.

Executei o comando gcc -Os fonte.c -o executavel.agi várias vezes, com flags de otimização diferentes. Máximo que consegui reduzir o tamanho do executável foi para 17 vezes.

O tamanho do fonte cheio de comentário é 448 Bytes;
O executável ficou em 7315 Bytes. (o máximo que conseguir reduzir)

Eu esperava que o tamanho do executável ficasse na ordem de grandeza do próprio fonte, já que os comentários são extensos.

Alguém consegue explicar o porque disso?
Esse overhead se deve a linkagem com o sistema operacional? porque da stdio.h o script só usa quatro funções. Fica parecendo que o compilador incluir todas as funções de stdio.h e as compila.
Gostaria que alguém da lista dirimisse minha dúvida.

Cléviton.




Só documentar abaixo está o pedaço de script do site: http://home.cogeco.ca/~camstuff/agi.html
/* PEQUENO PEDAÇO DE SCRIPT EM C PARA INTERFACE AGI DO ASTERISK */
//
/* A liguagem C funciona perfeito com o Asterisk mas você deve usar o comando 'setlinebuf' sobre a saída padrão (stdout) e a saída 
de erro padrão (stderr). Isso faz com que a bafferização aconteça de uma linha de cada vez (diferente do uso de um buffer extenso). 
Se você NÃO fizer isso sobre a sua saída padrão (stdout) então seu script vai desligar enquanto o Asterisk fica aguardando por um 
comando no caso do buffer (extenso) ainda não ficar cheio. Um script AGI mínimo em C se parece com isso: */
//
#include <stdio.h>
main() {
char line[80];
//
/* Usa a bafferização de linha */
setlinebuf(stdout);
setlinebuf(stderr);
//
   /* Lê e ignora o ambiente AGI */
      while (1) {
           fgets(line,80,stdin);
           if (strlen(line) <= 1) break;
       }
//
/* Envia ao Asterisk um comando - o comando SAY NUMBER */
printf("SAY NUMBER 123 \"\"\n");
//
/* Lê a resposta do Asterisk e mostra na Console */
fgets(line,80,stdin);
fputs(line,stderr);
}



Mais detalhes sobre a lista de discussão AsteriskBrasil