2009-07-27 8 views
1

에서 파일 기술자의 수를 증가 나는 시스템을 모니터링하고 주기적으로 로그를 인쇄하는 장기 실행 프로세스를 가지고있다. 10-15 분 이상 실행하면 다음과 같은 메시지가 표시되어 종료됩니다. 열린 파일이 너무 많습니다.리눅스

프로그램은 SIGUSR1 매 2 초 상승 실시간 timer_create() 및 timer_settime()를 사용하여 설정된다. 핸들러에는 하위에 하나의 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

+0

아래에서 언급했듯이 파일의 스트림 포인터 중 하나를 올바르게 닫지 않았습니다. 나는이 같은,()가 호출 된 FCLOSE 전에 뭔가를 반환했다 : 경우 (주파수를 == "1000000") 반환 0; else if (freq == "1333000") return 1; else if (freq == "1667000") return 2; fclose (fp); if-else 문 앞에 fclose를 놓고 수정했습니다. – Dhruv

답변

3

사용 lsof를 또는 디버거가 프로세스가 열려 무슨 파일을 찾을 수 있습니다. 제한을 늘리면 설명자가 부족한 지점이 지연됩니다.

+0

감사합니다. 나는/sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed 파일을 닫지 않았다. 이것은 lsof + p 을 실행하여 명확하게 나타납니다. – Dhruv