問題描述
shell腳本循環讀取文件? 遇到一個概率性問題:我用了popen來獲取另一個進程的輸出,使用的fgets來讀數據。但發現有個概率性問題,讀出來的數據有時會少了一截。根據調試發現,當fgets被信號中斷的時候,數據就會有問題。來看一下下面的代碼,我是做了信號中斷的錯誤處理的,但依然有問題。
while(!feof(fp))
{p = fgets(buf, sizeof(buf), fp);if(!p){if(errno == EINTR){continue;}else{break;}}req_format_write(wp, buf);
}
pclose(fp);
修復方法
? ? 將fgets替換為fread
????
while(!feof(fp)){readn = fread(buf, sizeof(char), sizeof(buf), fp);if(readn == 0){if(errno == EINTR){continue;}else{break;}}req_format_write(wp, buf);}pclose(fp);
分析
linux系統下,一些皆文件。不管是普通文本文件,管道,網絡套接字,驅動你都可以用c庫下面標準文件api(fread,fwrite,fgets...)來讀寫數據。但實際操作上,有些api用起來可能就有潛在問題。
popen是利用管道實現,管道相比于普通文件,它不可以重定位,即不能使用fseek,ftell這種api,讀出來的數據不會再被寫回去。
fgets的返回值
? ? ? fgets什么時候返回:讀到換行符、緩沖區被讀滿、文件被讀完、發生錯誤。注意:發生錯誤的時候會返回NULL.
? ? ??fgets當被信號中斷時,就會返回NULL。但是如果前面已經讀了一些數據,還是會返回NULL。那么前面返回的數據就丟失了,因為管道并沒有文件偏移一說。
fread的返回值
? ? ? ?fread返回實際讀到的字節數,所以當信號中斷時,讀到的字節都能返回回來,不會丟失。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态