Linux下明明輸出到文件了,為啥tail-f卻看不到?

Linux下對文件進行寫操作,為什麼有時候會有延時?今天一起來測試下。


Linux下明明輸出到文件了,為啥tail-f卻看不到?

測試代碼是一個打印hello與循環輪數的死循環程序,每打印一行就休眠1秒。

Linux下明明輸出到文件了,為啥tail-f卻看不到?

使用./a.out 運行程序後,每隔一秒會在終端輸出一個字符串。

Linux下明明輸出到文件了,為啥tail-f卻看不到?

使用nohup ./a.out運行程序後,有一個“忽略輸入,輸出至nohup.out”的提示。

Linux下明明輸出到文件了,為啥tail-f卻看不到?

把程序killall幹掉之後,果然有一個nohup.out生成。

不過這個文件的大小是0,有點奇怪,啟動程序的時候,明明提示了“appending output to nohup.out”呀,這是為什麼呢?原本打印在終端的hello字符串去哪裡了呢?

nohup.out未能及時輸出,是因為nohup後,為了提高性能stdout啟用了緩衝,並不會實時把內容寫入文件,只有當緩衝寫滿了才會刷盤。killall程序時,還來不及刷盤程序就退出了,於是出現了空nohup.out文件。

如果想要實時刷盤,可以選擇:

  • 把緩衝設為空,setbuf(stdout, NULL)

  • 強制刷盤,fflush(stdout)

Linux下明明輸出到文件了,為啥tail-f卻看不到?

如上圖,程序添加一行“fflush(stdout)”之後,再次測試。

Linux下明明輸出到文件了,為啥tail-f卻看不到?

就能夠看到nohup.out會實時的刷新數據啦。

討論:打印日誌的時候,是需要實時刷新,還是緩存刷新呢?


分享到:


相關文章: