[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