[問題] 在sub block做fopen並回傳問題

作者: jacky1989   2023-12-05 23:43:09
開發平台(Platform): (Ex: Win10, Linux, ...)
CentOS
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
GCC
問題(Question):
最近寫程式時,碰到在sub block做fopen,然後找到指定關鍵字後回傳
我是這樣寫的
#include<stdlib.h>
#include<stdio.h>
int main(){
int status=-1;
status=sub_test("test");
printf("Status is %d\n",status);
return 0;
}
int sub_test(char *filename){
fid_rd=fopen(filename,"r");
while(fscanf(fid_rd,"%s",&tmp)!=NULL){
if(strcmp("PASS",tmp)==0)
return 1;
}
fclose(fid_rd);
return 0;
}
這邊這樣寫,在編譯不會有問題,但是最近總覺得怪,檔案還沒被關閉就return回主程式
這樣真的不會造成記憶體的浪費嗎?有沒有人可以教我一下該怎麼去觀察記憶體使用狀況?
我在想是不是改成以下這種寫法比較好?
int status=0;
while(fscanf(fid_rd,"%s",&tmp)!=NULL){
if(strcmp("PASS",tmp)==0){
status=1;
break;
}
}
fclose(fid_rd);
return status;
再麻煩高手解答了,感謝
作者: wulouise (在線上!=在電腦前)   2023-12-05 23:52:00
fd開了就要自己關,如果不持續跑可能就還好
作者: Richun (解放左手的OO之力)   2023-12-06 00:38:00
回傳fd的同時,參數多個吃&status的ptr,決策權丟給caller
作者: Lipraxde (Lipraxde)   2023-12-06 09:13:00
最終 process 結束後 OS 會幫你回收只有在你自己這個 process 裡面浪費
作者: descent (「雄辯是銀,沉默是金」)   2023-12-06 10:12:00
可以先 fopen,改傳 FILE*,不要傳檔名讓sub_test()做fopensub_test 做完在 fclose
作者: stupid0319 (徵女友)   2023-12-06 21:35:00
老師是不是教你if內只能寫一行?我知道問題在哪了fclose(fid_rd);是不是只能出現一次?
作者: yvb   2023-12-07 22:57:00
嚴格說起來 fopen() 不檢查回傳值不是也該覺得怪?
作者: CoNsTaR ((const *))   2023-12-08 13:21:00
記憶體不會浪費吧,file descriptor 會浪費
作者: askacis (ASKA)   2023-12-09 15:55:00
一直重複開檔不關的行為,程式跑久了就會吃系統可用的fd系統會一堆靈異現象,直到你用lsof看才發現開了幾千個fd
作者: seanwu (海恩)   2023-12-09 23:31:00
你的想法是對的,fxxx系列函數一般的實作應該會有inputbuffer,會佔掉heap memory,fclose完才會釋放掉
作者: wulouise (在線上!=在電腦前)   2023-12-10 10:41:00
應該會先跳too many open files吧
作者: glo6e (ezdodance)   2023-12-25 22:50:00

Links booklink

Contact Us: admin [ a t ] ucptt.com