Linux下對文件進行寫操作,為什麼有時候會有延時?今天一起來測試下。
測試代碼是一個打印hello與循環輪數的死循環程序,每打印一行就休眠1秒。
使用./a.out 運行程序後,每隔一秒會在終端輸出一個字符串。
使用nohup ./a.out運行程序後,有一個“忽略輸入,輸出至nohup.out”的提示。
把程序killall幹掉之後,果然有一個nohup.out生成。
不過這個文件的大小是0,有點奇怪,啟動程序的時候,明明提示了“appending output to nohup.out”呀,這是為什麼呢?原本打印在終端的hello字符串去哪裡了呢?
nohup.out未能及時輸出,是因為nohup後,為了提高性能stdout啟用了緩衝,並不會實時把內容寫入文件,只有當緩衝寫滿了才會刷盤。killall程序時,還來不及刷盤程序就退出了,於是出現了空nohup.out文件。
如果想要實時刷盤,可以選擇:
把緩衝設為空,setbuf(stdout, NULL)
強制刷盤,fflush(stdout)
如上圖,程序添加一行“fflush(stdout)”之後,再次測試。
就能夠看到nohup.out會實時的刷新數據啦。
討論:打印日誌的時候,是需要實時刷新,還是緩存刷新呢?
閱讀更多 互聯網架構師之路 的文章