GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie leitet man die Ausgabe von system() in eine Datei um?

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.


Linux
  1. So leiten Sie die Ausgabe in eine Datei und Stdout in Linux um

  2. Wie ändere ich die Ausgabeumleitung eines laufenden Prozesses?

  3. Wie leite ich die Ausgabe eines Programms in eine Zip-Datei um?

  4. Ausgabe umleiten und leiten?

  5. Linux – Wie oft wird das Proc-Dateisystem unter Linux aktualisiert?

Einführung in das Linux-Dateisystem

So leiten Sie die Shell-Befehlsausgabe um

Was ist der Unterschied beim Umleiten einer Ausgabe mit >, &>, >&und 2&>?

Wie hängt man die Ausgabe an eine Datei an?

Wie kann die Ausgabe des Zeitbefehls in eine Datei unter Linux umgeleitet werden?

So leiten Sie die Ausgabe des systemd-Dienstes in eine Datei um