Retorno da Função system() [RESOLVIDO]

1. Retorno da Função system() [RESOLVIDO]

Célio de Jesus Santos
celiojs

(usa Suse)

Enviado em 16/05/2008 - 12:56h

Olá!! Estou precisando encontrar uma maneira de armazenar o retorno da função system em uma variável. Imaginem um programa que fica instalado em máquinas distintas e que eu passe um comando como o de obter a qtde de usuarios logados, só que ao invés de mostrar na tela, quero armazenar o retorno para possivel impressão.
Desde já agradeço pelo apoio.
Até mais,

Célio


  


2. MELHOR RESPOSTA

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 16/05/2008 - 13:32h

Ou em http://gravatai.ulbra.tche.br/~elgio/disciplinas
Escolha "Coisas que publico para o mundo" matricula VOL
(vou comentar o codigo la)

#include <stdio.h>
#include <stdlib.h>

int main()
{
int p[2], backup;
char buf[1000];

backup = dup(1);
close(0);
close(1);

pipe(p);
system ("ls -la");
dup2(backup, 1);

printf("O system gerou os dados:\n");
while (fgets(buf, 1000, stdin)){
printf("%s", buf);
}
}

3. Re: Retorno da Função system() [RESOLVIDO]

Felipe Abella
FelipeAbella

(usa Debian)

Enviado em 16/05/2008 - 13:13h

Acho que você quis dizer o retorno do *programa*
executado pelo system, e não a função system,
você pode pegar o retorno usando pipes.

Maneira 1:
Executar o programa usando fork, apos criar um pipe, e assim fazer a comunicação entre os programas.

Maneira 2:
A glib tem funções que facilitam bastante isso,
se você não vê problemas em ter a glib como dependência é uma boa solução.

Maneira 3:
Se quiser que apenas funcione e pronto (de forma horrível), use:
system("echo programa > /tmp/foo")
e entao leia do arquivo, tem vários problemas
com essa solução, não recomendo

T+




4. Re: Retorno da Função system() [RESOLVIDO]

Célio de Jesus Santos
celiojs

(usa Suse)

Enviado em 16/05/2008 - 13:54h

Pessoal,

Obrigado pelo apoio!! Farei alguns testes mais tarde.

Valew

Célio


5. Re: Retorno da Função system() [RESOLVIDO]

Geraldo José Ferreira Chagas Júnior
gjr_rj

(usa Debian)

Enviado em 16/05/2008 - 13:56h

Essa saída padrão, poderia ser alterada para um arquivo e não para o pipe ?

Pois, se uma saída fosse muito grande, poderia lotar o pipe ?


6. Re: Retorno da Função system() [RESOLVIDO]

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 16/05/2008 - 14:02h

Pode.

Uma das formas é a que nosso amigo acima classificou como "horrivel" (e é mesmo):

system("echo programa > /tmp/foo")

Agora tu abre e le /tmp/foo

Dai é SOMENTE ISTO, esquece o lance de pipes!
O pipes era para NÃO USAR ARQUIVO!


7. ler arquivo

João Marcos Menezes
stremer

(usa Arch Linux)

Enviado em 16/05/2008 - 16:07h

Não vejo algo como tão horrivel jogar a saida para um arquivo e ler o arquivo, pois em determinados casos é a unica coisa que se da pra fazer. Usar a saida padrão ou pipe pode ser perigoso em alguns casos. O melhor mesmo é não usar o comando system, pois ele dificulta muitas vezes a portabilidade do código para outros sistemas. Eu diria que ler o retorno do system não é tão nojento quanto usar o comando system.


8. Re: Retorno da Função system() [RESOLVIDO]

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 16/05/2008 - 16:11h

Ah stremer!

A forma que foi colocada, com um redir de shell, é feia!! :-D

Nada contra arquivos, mas sempre é bom poder evitar I/O, mas se for para fazer com arquivo, que seja dentro do código mesmo :-D

A solução mais elegante seria com fork+exec+pipe, onde simultaneamente um vai produzindo no pipe e o outr vai lendo. Mas ai seria MENOS portável ainda, pois a solução "feia" com system(comando > arquivo) funciona até no DOS!!

:-D


9. Re: Retorno da Função system() [RESOLVIDO]

Geraldo José Ferreira Chagas Júnior
gjr_rj

(usa Debian)

Enviado em 16/05/2008 - 16:20h

OK, a pergunta era com relação ao pipe mesmo, pois, o caso do arquivo só funciona com o system.

Sei que em outros casos, em princípio, não precisaria do pipe, mas quem sabe !


10. Re: Retorno da Função system() [RESOLVIDO]

Geraldo José Ferreira Chagas Júnior
gjr_rj

(usa Debian)

Enviado em 16/05/2008 - 16:41h

elgio, pintou outra dúvida.

Vamos supor que eu não queira imprimir a saída, ou seja, só teria entrada no pipe. Isso várias vezes não estouraria a memória, ou tem como limpá-lo ?

Teria que esvaziá-lo manualmente com um loop de leitura ?


11. então

João Marcos Menezes
stremer

(usa Arch Linux)

Enviado em 16/05/2008 - 16:55h

o detalhe da portabilidade não é neste caso, mas em usar system em diversos casos.
Ja vi cara usar o system para fazer um mero ls ao inves de usar as proprias funções ansi do c para fazer a leitura de arquivos.
Acho que system deve ser usado em ultimo caso, pois programar em C não é shell script.
No caso de executar algum programa, geralmente tem alguma biblioteca para executar as funções diretamente sem precisar fazer um system e neste caso usando a biblioteca é muito mais elegante.
Porém em ultimo caso, caso seja permitido o uso do pipe (que também não é portavel), então ele é melhor doque a leitura de arquivo.
E caso tenha de fazer o system de qualquer jeito e não tenha como usar o pipe, então o jeito feio se torna bonito pq antes ele, doque deixar o problema sem solução.

:P


12. Re: Retorno da Função system() [RESOLVIDO]

Vinicius de Souza Monteiro
vinicius94

(usa Outra)

Enviado em 05/08/2013 - 23:48h

Acredito que além das formas mencionadas, também dá para usar a captura do buffer. Ex:

ob_start();

system("echo vou pegar o buffer");

$retorno = ob_get_contents();

ob_end_clean();

a variável retorno vai ter agora o conteúdo do comando echo ("vou pegar o buffer").






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts