[英]linux dup2 and printf
我正在嘗試使用dup2重定向標准輸出到另一個文件:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main(void)
{
int newfd;
if ((newfd = open("output_file.txt", O_CREAT|O_TRUNC|O_WRONLY, 0644)) < 0) {
exit(1);
}
printf("Luke, I am your...\n");
dup2(newfd, 1);
printf("Foobar.\n");
return 0;
}
當第一個printf
打印換行符\\n
, Luke, I am your...
將被打印到屏幕上,並且Foobar
將被寫入到output_file.txt中 ,如果第一個printf不打印換行符printf("Luke, I am your...");
,這兩個字符串都將被寫入output_file.txt。 因此,當沒有換行符( \\n
)時,printf似乎會將第一個字符串寫入緩沖區。
那到底發生了什么呢?
原因是當您沒有換行符\\n
,將緩沖由printf()
打印的字符串。 因此,緩沖區的全部內容都將打印到文件中。 這與第二次調用printf()
無關。
如果您不使用fflush(stdout);
第一后printf()
你不會看到這種行為,不論你是否有新行'\\n
在第一個printf()
或沒有。 因為fflush()
將清除(刷新)所有緩沖的輸出,直到該點為止。
在printf()
中使用\\n
似乎可以正常工作的原因是因為printf()
在連接到終端設備時是行緩沖的。 因此, \\n
觸發刷新。
當FD在其下方切換時,第一個字符串仍將緩沖在FD中。 如果需要在切換之前確保FD已清除,請先調用fflush(stdout)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.