[AsteriskBrasil] Script AGI em C

Bernardino Campos bcampos em pobox.com.br
Segunda Maio 22 14:45:04 BRT 2006


Cleviton,

        Isto é bastante normal, só a função printf já é bem grandinha! Um 
programa de 4 linhas

-.-.-.-.-.
main()
{
       printf ("Oi");
}

gcc -s lixo.c -o lixo
lixo.c = 27 bytes
lixo    = 2884

Bernardino Campos

----- Original Message ----- 
From: <cleviton.araujo em caixa.gov.br>
To: <asteriskbrasil em listas.asteriskbrasil.org>
Sent: Monday, May 22, 2006 9:59 AM
Subject: [AsteriskBrasil] Script AGI em C


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

_______________________________________________
LIsta de discussões AsteriskBrasil.org
AsteriskBrasil em listas.asteriskbrasil.org
http://listas.asteriskbrasil.org/mailman/listinfo/asteriskbrasil

_______________________________________________
Acesse o  wiki AsteriskBrasil.org:
http://www.asteriskbrasil.org




Mais detalhes sobre a lista de discussão AsteriskBrasil