stdout
ist ein FILE *
Zeiger des Standard-Ausgabestroms. dup2
erwartet Datei-Deskriptor, auch Sie haben die Parameter Reihenfolge durcheinander gebracht. Verwendung
dup2(file, 1);
statt.
Auf der besser-zu-tun-dieser Teil. Dieser Weg ist schlecht, weil Sie wahrscheinlich Ihre Standardausgabe wiederherstellen möchten, nachdem dieser Aufruf system
abgeschlossen ist. Sie können dies auf verschiedene Arten tun. Sie können dup
es irgendwo und dann dup2
es zurück (und schließen Sie die dup
ped one). Ich persönlich mag es nicht, eigene cat
Implementierungen wie in anderen Antworten vorgeschlagen zu schreiben. Wenn das einzige, was Sie wollen, ist einen einzigen Shell-Befehl mit system
in eine Datei im Dateisystem umgeleitet, dann wohl die direkteste und einfachste Weg, um den Shell-Befehl zu konstruieren, dies zu tun, wie
system("ls -l > Result");
Aber Sie müssen Seien Sie vorsichtig, wenn der Dateiname (Ergebnis) von einer Benutzereingabe kommt, da der Benutzer so etwas wie 'Result; rm -rf /*'
als Dateinamen liefern kann.
Auch zum Thema Sicherheit sollten Sie den vollständigen Pfad zu ls
Angabe betrachten, wie in den Kommentaren vorgeschlagen:
system("/bin/ls -l > Result");
Warum verwenden Sie nicht nur die '>' Umleitung im 'system' Befehl? –
Verwenden Sie 'system (" ls -l> Result ");' oder machen Sie Ihre eigene 'fork()'/'exec *()' Kombination. –
Verwenden Sie nicht 'System'. Es ist immer falsch. Führen Sie den Child-Prozess selbst ohne Shell aus, entweder mit 'fork' und' execvp' oder 'posix_spawn'. –