1. linux下用dup2關閉標準輸出后,使用printf列印資訊的問題。
2. 代碼如下:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main()
{
int fd1=open("eup.txt", O_RDWR | O_CREAT | O_TRUNC, 0644);
if(fd1==-1){
printf("#LINE %d:",__LINE__);
perror("open");
return -1;
}
//printf("Hello, World!\n");//不加這句,eup.txt中沒內容。
int fd2=dup2(fd1,1);
if(fd2==-1){
printf("#LINE %d:",__LINE__);
perror("open");
return -1;
}
printf("fd1:%d\nfd2:%d\nfd3:%d\n",fd1,fd2,3);
close(fd2);
close(fd1);
return 0;
}
3.問題為將printf("Hello, World!\n");這句話注釋掉,運行程式后eup.txt里面
沒有任何內容,這個是正確的。但是為什么加上這句話后,eup.txt里面就有
內容?同時如果將"Hello, World!\n"換為"Hello, World!"的話,運行程式
會發現Hello, World!列印在eup.txt里面??這是為什么?不是說只有stdout的緩沖區
是通過‘\n’進行行重繪的,為什么加上printf("Hello, World!\n");后,會在
eup.txt里面列印出內容:
fd1:4
fd2:1
fd3:3.
printf("fd1:%d\nfd2:%d\nfd3:%d\n",fd1,fd2,3);這個列印資訊不是應該在
讀寫檔案的緩沖區中嗎,\n不能刷檔案的緩沖區,所以這個內容為什么列印
出來了。
4.注意:以上代碼在linux系統下運行,windows就不用驗證了,大家都懂的
uj5u.com熱心網友回復:
運行完之后,雖然沒有'\n'但是呼叫close了,會把快取里的內容刷到檔案里。你的問題是不是這樣的?
uj5u.com熱心網友回復:
不是的,close不能刷緩沖的。程式中將printf("Hello, World!\n");這句話注釋掉,運行后eup.txt里面沒有任何內容,這說明\n和close不能刷檔案的緩沖。我的問題是為什么printf("Hello, World!\n");不注釋掉,運行程式后eup.txt里面有內容,這個內容是怎么寫進去的?uj5u.com熱心網友回復:
我覺得可能是沒有printf("Hello, World!\n");的時候,標準輸出的檔案描述符沒有打開,所以dup2是把檔案描述符1直接指向eup.txt檔案,這樣就和普通的檔案描述符一樣,不能重繪檔案緩沖而如果有printf("Hello, World!\n");則標準輸出檔案符被打開,dup2重新把該檔案符指向eup.txt檔案時,相當于把標準輸出重定向到檔案,這樣改檔案描述符具有標準輸出的緩沖,同時又被重定向到了檔案,所以后面的printf能把內容輸出到檔案
這樣,也能解釋printf("Hello, World!")沒有換行時該內容為何也能保存到檔案,因為標準輸出的緩沖沒有沒重置重繪,只是被重定向到了檔案,所以后面的printf也會把之前的緩沖也一起保存到檔案
僅僅是個人猜測
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/22474.html
標籤:C語言
上一篇:MATLAB信號處理中卷積的問題
