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.