2011-07-24 21 views
6

Girişi bir dosyaya yeniden yönlendirmek için C'deki yönlendirmeleri kullanmaya çalışıyorum ve ardından standart çıktıyı ekrana yazdırmak üzere ayarlayın. Birisi bana bu kodun nesi yanlış olduğunu söyleyebilir mi? Bu hiç çalışacaktır önce gerekecekstandart çıktıyı c'ye yeniden yönlendiriyor ve daha sonra standart çıktıyı sıfırlıyor

#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; 
} 
+1

Burada aynı sorunu çözmek için tamamen farklı bir yol var: http://stackoverflow.com/questions/584868/rerouting-stdin-and-stdout-from-c. – Sam

cevap

3

Kişisel ikinci dup2 çağrı yanlış, ile değiştirin.

4

bir şey yapmak emin olmak için, bunun altından stdout dosya tanıtıcı geçiş yapmadan önce fflush(stdout); aramak. Muhtemelen, C standart kütüphanesinin, sizin altındaki dosya tanımlayıcılarını değiştirdiğinizden habersiz çıktınızın çıktısını tamponlamasıdır. printf() kullanarak yazdığınız veriler, arabellek doluncaya kadar (veya programınız main'dan döndüğünüzde) temel dosya tanıtıcısına aslında gönderilmez. dup2() yönelik her iki çağrıda önce

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

:

böyle çağrıyı yerleştirin.

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

Bunun OP'nin problemi olduğunu sanmıyorum, ama bu çok iyi bir öneridir ve stdio'yu dosya tanımlayıcısı io ile karıştırdığınızda hemen her zaman takip edilmelidir. –

+1

Bu doğru, aslında bir başkasının bahsettiği kadar yanlış dosya tanıtıcıyı fark etmedim. Bir terminale yazılırken, stdio çıktısı büyük olasılıkla satır tamponlu olacaktır, bu yüzden fflush() 'olmayan kod, OP stdout'u bir dosyaya yeniden yönlendirene kadar çalışacaktır. –

1

Sadece dup2(current_out, 1) ile dup2(current_out, file) değiştirin ve daha iyi olup olmalıdır:

İlgili konular