在討論 setvbuf 與 setbuf 函數之前,先來看如下一段範例程式碼:
int main(void)
{
FILE* fp=NULL;
int fd;
const char *f1="testfprintf.log";
const char *f2="testwrite.log";
fp = fopen(f1, "wb");
if(fp == NULL)
{
return -1;
}
fd = open(f2, O_WRONLY|O_CREAT|O_EXCL, 0666);
if(fd < 0)
{
return -1;
}
while(1)
{
fprintf(fp, "fprintf------|n");
write(fd, "write|n", sizeof("write|n"));
sleep(1);
}
return 0;
}
在上面的範例程式碼中,使用 fprintf 函數對檔案 testfprintf.log 執行寫入操作,使用 write 函數對檔案 testwrite.log 執行寫入操作。這裡需要注意的是,因為 fprintf 函數會緩衝 4096 位元組的資料,只有當達到這麼多位元組的資料時才會進行實際的磁碟寫入。
因此,執行上面的範例程式,然後實時檢視 testfprintf.log 檔案與 testwrite.log 檔案,會發現 testfprintf.log 檔案不會被實時寫入,只有當寫入的資料的大小為 4096 位元組的倍數的時候才會被寫入;而 write 函數則不同,因為它不進行任何緩衝(直接寫入磁碟),所以檔案 testwrite.log 不斷有資料寫入,執行結果如圖 1 所示。
圖 1 範例程式碼的執行結果