[問題] popen錯誤問題

看板C_and_CPP (C/C++)作者 (Light)時間10年前 (2015/06/14 11:44), 編輯推噓0(0017)
留言17則, 2人參與, 最新討論串1/1
開發平台(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錯誤,但我都有正常關閉檔案,為什麼會出現 這種錯誤呢? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.129.73.12 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1434253495.A.6EA.html

06/14 12:03, , 1F
通常會出現這個問題是因為 file handle leak
06/14 12:03, 1F

06/14 12:03, , 2F
有「可能」是因為沒有完成 destroy 所以到達 limit
06/14 12:03, 2F

06/14 12:05, , 3F
骯髒的手法是直接 ulimit -n <fd-num> 來加大 limit
06/14 12:05, 3F

06/14 12:05, , 4F
雖然這不能從根本上解決問題,不過畢竟是有效的解決
06/14 12:05, 4F

06/14 12:06, , 5F
不然可以修改 /proc/sys/fs/file-max
06/14 12:06, 5F

06/14 12:07, , 6F
如果有強迫症的話,用 lsof 看一下到底有哪些檔案
06/14 12:07, 6F

06/14 12:07, , 7F
並沒有被關閉,還正在被你的程式讀取
06/14 12:07, 7F

06/14 12:09, , 8F
因這要跑無限個小時,又算加大應該還是會有問題
06/14 12:09, 8F

06/14 12:10, , 9F
那就用 lsof 先確認到底是哪些檔案沒有 pclose 到
06/14 12:10, 9F

06/14 12:11, , 10F
哦~對了,你用 popen 的話好像不能這樣弄
06/14 12:11, 10F

06/14 12:12, , 11F
那就先檢查一下 pclose 的回傳值
06/14 12:12, 11F

06/14 12:13, , 12F
The pclose() function returns -1 if wait4(2)
06/14 12:13, 12F

06/14 12:13, , 13F
returns an error,or some other error is detected
06/14 12:13, 13F

06/14 12:17, , 14F
還有,你沒有檢查回傳值,怎麼知道是否正常關閉檔案
06/14 12:17, 14F

06/14 12:27, , 15F
感謝,我在試看看
06/14 12:27, 15F

06/14 12:29, , 16F
那關閉回傳值錯誤,我要怎繼續這個程式呢?
06/14 12:29, 16F

06/14 12:31, , 17F
先把 sleep(1) 拿掉試試看吧
06/14 12:31, 17F
文章代碼(AID): #1LVFYtRg (C_and_CPP)
文章代碼(AID): #1LVFYtRg (C_and_CPP)