看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
Hazukashiine: 通常會出現這個問題是因為 file handle leak 06/14 12:03
Hazukashiine: 有「可能」是因為沒有完成 destroy 所以到達 limit 06/14 12:03
Hazukashiine: 骯髒的手法是直接 ulimit -n <fd-num> 來加大 limit 06/14 12:05
Hazukashiine: 雖然這不能從根本上解決問題,不過畢竟是有效的解決 06/14 12:05
Hazukashiine: 不然可以修改 /proc/sys/fs/file-max 06/14 12:06
Hazukashiine: 如果有強迫症的話,用 lsof 看一下到底有哪些檔案 06/14 12:07
Hazukashiine: 並沒有被關閉,還正在被你的程式讀取 06/14 12:07
wind00962: 因這要跑無限個小時,又算加大應該還是會有問題 06/14 12:09
Hazukashiine: 那就用 lsof 先確認到底是哪些檔案沒有 pclose 到 06/14 12:10
Hazukashiine: 哦~對了,你用 popen 的話好像不能這樣弄 06/14 12:11
Hazukashiine: 那就先檢查一下 pclose 的回傳值 06/14 12:12
Hazukashiine: The pclose() function returns -1 if wait4(2) 06/14 12:13
Hazukashiine: returns an error,or some other error is detected 06/14 12:13
Hazukashiine: 還有,你沒有檢查回傳值,怎麼知道是否正常關閉檔案 06/14 12:17
wind00962: 感謝,我在試看看 06/14 12:27
wind00962: 那關閉回傳值錯誤,我要怎繼續這個程式呢? 06/14 12:29
Hazukashiine: 先把 sleep(1) 拿掉試試看吧 06/14 12:31