stdout
ist ein FILE *
Zeiger des Standardausgabestroms. dup2
erwartet Dateideskriptor, außerdem haben Sie die Parameterreihenfolge durcheinander gebracht.Verwenden Sie
dup2(file, 1);
stattdessen.
Auf dem besseren Weg, dies zu tun. Dieser Weg ist schlecht, weil Sie wahrscheinlich Ihre Standardausgabe nach diesem system
wiederherstellen möchten Anruf abgeschlossen. Sie können dies auf verschiedene Weise tun. Sie können dup
es irgendwo und dann dup2
zurück (und schließen Sie die dup
ped ein). Ich persönlich mag es nicht, cat
selbst zu schreiben Implementierungen wie in anderen Antworten vorgeschlagen. Wenn Sie nur einen einzelnen Shell-Befehl mit system
umleiten möchten zu einer Datei im Dateisystem, dann ist es wahrscheinlich der direkteste und einfachste Weg, den Shell-Befehl zu konstruieren, um dies zu tun, wie
system("ls -l > Result");
Aber Sie müssen vorsichtig sein, wenn der Dateiname (Ergebnis) aus einer Benutzereingabe stammt, da der Benutzer so etwas wie 'Result; rm -rf /*'
eingeben kann als Dateiname.
Auch zum Thema Sicherheit sollten Sie erwägen, den vollständigen Pfad zu ls
anzugeben wie in den Kommentaren vorgeschlagen:
system("/bin/ls -l > Result");
Die einfache Sache ist, >
zu verwenden tatsächlich:
#include <stdio.h>
int main()
{
system("ls -l > /some/file");
return 0;
}
Eine Alternative ist die Verwendung von popen()
, etwas in der Art von
#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;
}
Sie sollten den popen()
verwenden Bibliotheksfunktion und liest Datenblöcke aus dem zurückgegebenen FILE *
und schreiben Sie sie in eine beliebige Ausgabedatei.
Referenz.