2014-03-31 89 views
0
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
//#include <iostream> 
#include <string.h> 
#include <fcntl.h> 
#include <signal.h> 

int main(){ 
int stdout = dup(1); 
char p[] = "test.txt"; 
close(1); 
int output = open(p, O_WRONLY | O_CREAT | O_TRUNC, 0777); 
//std::cout << "lala" << endl; 
printf("lala\n"); 
close(output); 

dup(stdout); 
close(stdout); 
printf("lolo\n"); 
// std::cout << "lolo" << endl; 
return 0; 
} 

我認爲的printf和std ::法院要輸出同樣的事情,我想在終端屏幕上的文件「拉拉」和「洛洛」 ,爲什麼這個版本(與prinf)在屏幕上打印所有內容,並且「std :: cout」版本按我喜歡的方式打印。文件描述符,printf和性病::法院之間的差異

回答

1

這與庫的內部緩衝有關。 "lala\n"太小而不能立即刷新到流中,因此它會保留在printf內部緩衝區中,直到稍後刷新爲止。

如果添加fflush那麼你得到想要的結果:

int main(){ 
    int stdout_fd = dup(1); 
    char p[] = "test.txt"; 
    close(1); 
    int output = open(p, O_WRONLY | O_CREAT | O_TRUNC, 0777); 
    //std::cout << "lala" << endl; 
    printf("lala\n"); 
    fflush(stdout); // flush the internal buffer 
    close(output); // fclose would flush too 

    dup(stdout_fd); 
    close(stdout_fd); 
    printf("lolo\n"); 
    // std::cout << "lolo" << endl; 
    return 0; 
} 

而且我已經改名爲局部變量stdout,因爲這是一個全球性的stdio定義之一。還有stdinstderrFILE *指向那些stdio控制流。

相關問題