2009-07-27 37 views
1

我有一個長時間運行的進程,它監視系統並打印週期性日誌。如果我讓它運行超過10-15分鐘,它將退出並顯示一條消息: 打開的文件過多。在Linux中增加文件描述符的數量

該程序使用實時timer_create()和timer_settime()每2秒引發一次SIGUSR1來設置。在處理程序中,在子節點中有一個fork() - exec()在/ proc/acpi/battery/state和/ sys/devices/system/cpu/cpu0上有父母和後續mmap()和流操作的等待/ cpufreq/scaling_cur_freq和scaling_setspeed文件。 我已經注意在週期性信號處理程序和所有其他地方關閉流FILE *指針。我也確保了所有映射文件的munmap()。

我該如何解決這個問題? 我應該增加允許的最大文件描述符,還是應該增加ulimit -aS顯示的最大打開文件? 爲什麼如果我使用fclose()關閉所有FILE *,會發生這種情況?

這裏有值我的系統,截至目前:

#cat /proc/sys/fs/file-max 
152808 

#ulimit -aS 
. 
. 
. 
. 
open files (-n) 1024 
+1

你肯定在某個地方泄漏。 – Joe 2009-07-27 16:33:59

+0

就像我在下面提到的,我沒有正確關閉其中一個文件的流指針。我在fclose()被調用之前返回,如下所示: if(freq ==「1000000」) return 0; (頻率==「1333000」) 返回1; else if(freq ==「1667000」) return 2; fclose(fp); 我把fclose放在if-else語句之前,它已經修復了。 – Dhruv 2009-07-27 18:17:05

回答

3

使用lsof的或調試器來查找文件的進程打開。增加限制只會延遲描述符用完的時間點。