Frage

Ich versuche, Weiterleitungen in C zu verwenden, um die Eingabe in eine Datei umzuleiten und dann die Standardausgabe wieder auf den Bildschirm zu drucken. Könnte mir jemand sagen, was mit diesem Code los ist?

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char** argv) {
    //create file "test" if it doesn't exist and open for writing setting permissions to 777
    int file = open("test", O_CREAT | O_WRONLY, 0777);
    //create another file handle for output
    int current_out = dup(1);

    printf("this will be printed to the screen\n");

    if(dup2(file, 1) < 0) {
        fprintf(stderr, "couldn't redirect output\n");
        return 1;
    }

    printf("this will be printed to the file\n");

    if(dup2(current_out, file) < 0) {
        fprintf(stderr, "couldn't reset output\n");
        return 1;
    }

    printf("and this will be printed to the screen again\n");

    return 0;
}
War es hilfreich?

Lösung

Deine zweite dup2 Anruf ist falsch, ersetzen Sie:

if (dup2(current_out, 1) < 0) {

Andere Tipps

Eine Sache, die Sie tun müssen, bevor dies überhaupt funktioniert, ist, anzurufen fflush(stdout); Vor dem Umschalten der stdout Dateideskriptor unter ihm heraus. Was wahrscheinlich passiert, ist, dass die C -Standardbibliothek Ihre Ausgabe puffert und nicht weiß, dass Sie sich darunter um die darunter liegenden Dateideskriptoren verschieben. Die Daten, die Sie verwenden, verwenden Sie printf() nicht eigentlich An den zugrunde liegenden Dateideskriptor gesendet, bis sein Puffer voll ist (oder Ihr Programm kehrt von main).

Fügen Sie den Anruf wie diesen ein:

    fflush(stdout);
    if(dup2(file, 1) < 0) {

bevor beide Anrufe zu dup2().

Einfach ersetzen dup2(current_out, file) mit dup2(current_out, 1), und die Dinge sollten besser funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top