stdout
je FILE *
ukazatel standardního výstupního proudu. dup2
očekává deskriptor souboru, také jste zpackali parametry order.Use
dup2(file, 1);
místo toho.
Na lepší způsob, jak to udělat. Tento způsob je špatný, protože pravděpodobně budete chtít obnovit svůj standardní výstup po tomto system
hovor se dokončí. Můžete to udělat různými způsoby. Můžete dup
to někam a pak dup2
jej zpět (a zavřete dup
ped jeden). Osobně nerad píšu vlastní cat
implementace, jak je navrženo v jiných odpovědích. Pokud jediné, co chcete, je přesměrování jediného příkazu shellu s system
do souboru v souborovém systému, pak pravděpodobně nejpřímějším a nejjednodušším způsobem je vytvořit příkaz shell, který to udělá jako
system("ls -l > Result");
Ale musíte být opatrní, pokud název souboru (Výsledek) pochází z uživatelského vstupu, protože uživatel může zadat něco jako 'Result; rm -rf /*'
jako název souboru.
Pokud jde o zabezpečení, měli byste zvážit zadání úplné cesty k ls
jak je navrženo v komentářích:
system("/bin/ls -l > Result");
Jednoduchá věc je použít >
skutečně:
#include <stdio.h>
int main()
{
system("ls -l > /some/file");
return 0;
}
Alternativou je použití popen()
, něco ve smyslu
#include <stdio.h>
#include <stdlib.h>
main()
{
char *cmd = "ls -l";
char buf[BUFSIZ];
FILE *ptr, *file;
file = fopen("/some/file", "w");
if (!file) abort();
if ((ptr = popen(cmd, "r")) != NULL) {
while (fgets(buf, BUFSIZ, ptr) != NULL)
fprintf(file, "%s", buf);
pclose(ptr);
}
fclose(file);
return 0;
}
Měli byste použít popen()
funkce knihovny a čtení částí dat z vráceného FILE *
a zapište je do libovolného výstupního souboru.
Reference.