在編寫一個每秒讀取網卡 eth0 流量的小程序時,發現加入 break 語句後,輸出只有第二次發生變化,隨後數據不再更新。代碼片段如下:
while(1){
while(fgets(buf, MAXLINE, fp) != NULL){
if(strncmp(buf, dev, 6)==0){
printf("%s\n", buf);
break;
}
}
rewind(fp);
sleep(1);
}
當 break 跳出內層循環時,文件指針停留在匹配行的末尾。隨後調用 rewind(fp) 將指針移回文件開頭,但標準 I/O 庫的緩衝區中仍殘留上次讀取未處理的數據。下一次 fgets 會優先消耗緩衝區內容,而不會重新從磁盤讀取,導致讀到的仍是舊數據。
將 break 替換為 fseek(fp, -1L, SEEK_END)(或根據具體邏輯調整偏移量),使文件指針定位到文件末尾,強制下一次循環重新填充緩衝區,從而讀取最新的 /proc/net/dev 內容。
break 僅跳出循環,不會刷新或重置文件流緩衝區。rewind 僅移動文件指針,不清空用戶態緩衝區。fseek 定位到文件末尾可觸發緩衝區失效,迫使下次讀取獲取最新數據。修正後程序可穩定每秒輸出最新網卡流量統計。