Witam
dawno temu miałem podobny problem kturego rozwiązanie wbrew pozorom okazuje się bardzo przydatne, dzięki temu można w łatwy sposób "uzupełnić" czyste C w zewnętrzne wywołania np. powłoki a w niej korzystać z grepa, awk itp.
dodatkowo bezpośrednie czytanie wykonywanych poleceń jest bardziej praktyczne niż pliki pomocnicze (a'la DOS) albo pisanie wszystkiego w czystym C.
Ten przykład kodu wymaga dodania obsługi błędów, jeśli ktoś lubi to może wykorzystać dup2(), waitpid() itp
#include
#include
#include
#include
/*
przekazuje do powłoki polecenie "cmd" którego
wyjście zostaje przekierowane na deskryptor
przekazany funkcji 'fun'
*/
void run( char *cmd,void (*fun)(int) )
{
int p[2];
pipe(p);
switch( fork() )
{
case -1:
perror("fork error");
return;
case 0:
close(1); dup(p[1]); close(p[0]); close(p[1]);
/* write(1,"start\\n",6); */ system(cmd); /*
write(1,"end\\n",4); */
exit(0);
default:
close(p[1]); (*fun)(p[0]); close(p[0]);
wait(0);
break;
}
}
/*
! to tylko przykładowa funkcja
*/
void reader( int fd )
{
char str[256]; FILE *fp = fdopen(fd,"r");
while( fgets(str,256,fp) )
printf("%s",str);
}
/*
i przykładowe wykorzystanie całości
*/
main()
{
run("/sbin/ifconfig eth0 "
" | grep HWaddr"
" | awk '{ print $5 }'",
reader
);
}
Mistrz Foo powiedział kiedyś do odwiedzającego go programisty: "W jednej linii skryptu owłoki znajdziesz więcej natury Uniksa niż w dziesięciu tysiącach linii kodu C". ...
(źródło: UNIX Sztuka programowania)