Como ler texto escrito no terminal após usar um comando system()

1. Como ler texto escrito no terminal após usar um comando system()

Rafael Marinho de Araújo
RafaelMA

(usa Manjaro Linux)

Enviado em 23/02/2016 - 12:30h

Supondo que eu use system("ls"), como eu consigo ler os nomes das pastas e arquivos escritos no terminal?


  


2. Re: Como ler texto escrito no terminal após usar um comando system()

Paulo
paulo1205

(usa Ubuntu)

Enviado em 23/02/2016 - 13:23h

RafaelMA escreveu:

Supondo que eu use system("ls"), como eu consigo ler os nomes das pastas e arquivos escritos no terminal?


Somente com os seus olhos e seu cérebro. E eu falo sério!

Para que algum processo leia o que outro escrever na saída padrão, essa saída não pode ir para o terminal (ao menos não diretamente), mas deve ser enviada para o processo que pretende consumi-la.

No mundo UNIX, a forma mais simples de receber (ou enviar) dados de (ou para) um programa externo é através de pipes. Leia a documentação de popen().


3. Re: Como ler texto escrito no terminal após usar um comando system()

Rafael Marinho de Araújo
RafaelMA

(usa Manjaro Linux)

Enviado em 23/02/2016 - 15:40h

Pelo o que eu sei de c++, achei que isso seria assim. Mas tudo bem, já dei um jeito no problema.


4. Hack, hack

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 23/02/2016 - 18:56h

Olá,

Você pode utilizar um pequeno hack e usar um arquivo "temporário" (pode deletar o arquivo depois):


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(void)
{
/* oldout tem copia de stdout */
int fd, oldout = dup(1);

/* fecha stdout */
close(1);

/* open sempre retorna o menor descritor disponivel */
if((fd = open("out.txt", O_CREAT | O_WRONLY,
S_IWUSR | S_IRUSR)) < 0) {
perror("open");
exit(0);
}

system("ls");

/* fecha arquivo */
close(fd);

/* restaura stdout */
dup2(oldout, 1);


printf("ls done...\n");
printf("tratar arquivo out.txt aqui...\n");

return 0;
}



O programa utiliza open para abrir um arquivo (O_CREAT para criá-lo caso não exista), e dá ao dono do arquivo permissões de leitura e escrita (S_IWUSR | S_IRUSR). Depois utiliza dup2 para duplicar um descritor de arquivo. Leia o manual da função para entender melhor como ela funciona e como restaurar o fd antigo depois.

Após ler os conteúdos do stdout para o arquivo, você pode fecha-lo, restaurar a stdout antiga e reabrir o arquivo como leitura. Após aberto, cada linha do arquivo é um item da listagem do ls.

Mas o caminho correto seria, como já dito pelo paulo1205, utilizar fork(), execve(), pipe(), etc...

Utilizar hacks em código de produção não é boa prática... (Usar system não é boa prática)

[]'s
Enzo Ferber


$ indent -kr -i8 src.c

"(...)all right-thinking people know that (a) K&R are _right_ and (b) K&R are right." - linux/Documentation/CodingStyle - TORVALDS, Linus.







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts