[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