shell腳本循環讀取文件,popen后用fgets讀數據的問題

 2023-10-17 阅读 21 评论 0

摘要:問題描述 shell腳本循環讀取文件? 遇到一個概率性問題:我用了popen來獲取另一個進程的輸出,使用的fgets來讀數據。但發現有個概率性問題,讀出來的數據有時會少了一截。根據調試發現,當fgets被信號中斷的時候,數據就會有問題。來看一下下

問題描述

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返回實際讀到的字節數,所以當信號中斷時,讀到的字節都能返回回來,不會丟失。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/143465.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息