[問題] popen錯誤問題

作者: wind00962 (Light)   2015-06-14 11:44:53
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
linux
問題(Question):
出現too many open file
程式碼(Code):(請善用置底文網頁, 記得排版)
FILE *fp;
char bufferp[100];
while(1){
fp = popen("ls /tmp/file","r");
if (fp != NULL){
if(fgets(buffer,sizeof(buffer),fp) == NULL){
printf("no file\n");
}else
printf("have file");
}else{
perror("popen");
}
pclose(fp)
sleep(1);
}
跑大概兩個小時會出現too many open file錯誤,但我都有正常關閉檔案,為什麼會出現
這種錯誤呢? 謝謝
作者: Hazukashiine (私は幸せです)   2015-06-14 12:03:00
通常會出現這個問題是因為 file handle leak有「可能」是因為沒有完成 destroy 所以到達 limit骯髒的手法是直接 ulimit -n <fd-num> 來加大 limit雖然這不能從根本上解決問題,不過畢竟是有效的解決不然可以修改 /proc/sys/fs/file-max如果有強迫症的話,用 lsof 看一下到底有哪些檔案並沒有被關閉,還正在被你的程式讀取
作者: wind00962 (Light)   2015-06-14 12:09:00
因這要跑無限個小時,又算加大應該還是會有問題
作者: Hazukashiine (私は幸せです)   2015-06-14 12:10:00
那就用 lsof 先確認到底是哪些檔案沒有 pclose 到哦~對了,你用 popen 的話好像不能這樣弄那就先檢查一下 pclose 的回傳值The pclose() function returns -1 if wait4(2)returns an error,or some other error is detected還有,你沒有檢查回傳值,怎麼知道是否正常關閉檔案
作者: wind00962 (Light)   2015-06-14 12:27:00
感謝,我在試看看那關閉回傳值錯誤,我要怎繼續這個程式呢?
作者: Hazukashiine (私は幸せです)   2015-06-14 12:31:00
先把 sleep(1) 拿掉試試看吧

Links booklink

Contact Us: admin [ a t ] ucptt.com