2011-11-09 2 views
5

나는 epoll_wait를 사용하여 64 비트 Linux에서 파일 설명자를 기다리는 프로그램을 작성하고 있으며 epoll_event 사용자 데이터에 파일 설명자와 함께 정보를 넣으려고합니다.64 비트 Linux에서 파일 디스크립터 범위는 어떻게됩니까?

사실 파일 설명자가 32 비트를 초과 할 가능성은 거의 없습니다. 커널이 파일 디스크립터가 특정 범위를 갖도록 보장하는지, 아니면 단지 작은 것으로 계산하고 매우 커지지 않을지를 알고 싶을뿐입니다.

+0

FD 번호가 재활용 된 것 같습니다. 프로세스에 대한 최대 동시 공개 디스크립터 수를 초과하지 마십시오. 그러나 .... 나는 단서가 없습니다. –

+0

fd는 정의에 따라 "작은"음이 아닌 int이며, 런타임에 "작은"것이 무엇이든간에. 그 외에도 커널은 그 가치를 보장하지 않습니다. –

답변

9

새로운 filedescriptors를 추가하는 인터페이스는 int fd 인수를 사용하므로 이미 잘 알고있는 Linux 플랫폼에서 32 비트 범위로 제한됩니다.

모든 프로세스의 열린 파일 수에 대한 시스템 전체 제한은 /proc/sys/fs/file-max입니다. /proc/sys/fs/file-max은 현재 내 시스템에서 595956입니다.

각 프로세스는 열린 파일 수에 대한 프로세스 당 제한 인 setrlimit(2)RLIMIT_NOFILE을 통해 더 제한됩니다. 1024는 일반적인 RLIMIT_NOFILE 제한입니다. (이 제한을 /etc/security/limits.conf을 통해 변경하는 것은 매우 쉽습니다.)

1024 개가 넘는 희귀 한 응용 프로그램입니다. 열린 파일마다 표현하기 위해 일부 커널 메모리가 필요하기 때문에 전체 32 비트는 거의 발생하지 않을 것입니다. ~ 280 바이트 struct inode 구조 (최소)는 고정 된 메모리의입니다.

+0

감사합니다. 그런 다음 안전하게 사용할 수 있도록 조금 남겨 두었습니다. –

2

20 억 개의 파일 설명자를 열 계획이 있습니까? OS가이 문제를 처리 할 것으로 예상하십니까?

대부분의 * nix에서 FD를 반환하는 함수는 int으로 반환하고 <은 잘못된 설명자입니다. 이러한 함수는 int에 FD를 반환하므로 형식의 범위는 FD의 범위입니다. (마이너스 네거티브 (말장난 의도 없음)) 나는 따라 올거야 : 동일한 유형을 사용하십시오, 따라서, int.

1

하드 상한이 1024 * 1024임을 나타내는 커널 주석을 발견했습니다.

-1

64 비트 (32 비트 시스템에도 적용) Linux에서 파일 설명자의 범위는 0에서 1023까지이므로 열린 파일 설명자를 1023 개 이상 만들 수는 없습니다. 1023 개 이상의 파일 설명자를 열려고하면 시스템에서 EBADF (잘못된 파일 설명자) 오류 9를 반환합니다.

관련 문제