Question

Je suis en train d'utiliser en C réoriente à l'entrée de redirection vers un fichier et retour de sortie standard puis réglez à imprimer sur l'écran. Quelqu'un pourrait-il me dire ce qui ne va pas avec ce code?

#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;
}
Était-ce utile?

La solution

Votre deuxième appel dup2 est erroné, remplacer par:

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

Autres conseils

Une chose que vous devez vous assurer de le faire avant cela ne fonctionnera pas du tout, est d'appeler fflush(stdout); avant de passer le descripteur de fichier stdout hors de dessous. Qu'est-ce qui se passe probablement est que la bibliothèque standard C est mise en mémoire tampon de votre sortie, pas au courant que vous déplacer autour de descripteurs de fichiers en dessous. Les données que vous écrivez à l'aide printf() ne sont pas en fait envoyé au descripteur de fichier sous-jacent jusqu'à ce que sa mémoire tampon est pleine (ou votre programme de rendement main).

Insérer l'appel comme ceci:

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

avant que les deux appels à dup2().

Il suffit de remplacer dup2(current_out, file) avec dup2(current_out, 1), et les choses devraient fonctionner mieux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top