2008-09-09 6 views
3

소켓을 만들거나 파일을 C에서 열거 나 만들 때 소켓/파일에 할당 된 파일 설명자가 가장 낮은 값의 디스크립터로 사용 가능합니까? 이 점에서 C 스펙은 파일 기술자 할당에 대해 무엇을 말하고 있는가?C의 파일 설명자 할당

답변

5

가장 낮지는 않습니다. 구현에 따라 달라집니다. (1). 그러나 일반적으로 열려있는 파일 설명자를 지정하는 루틴은 처음 열어주는 방법을 사용합니다. 몇 개의 낮은 것들을 무료로 비워 둔다면 바로 당신이 예상 할 수있는 것보다 더 높은 기술자를 남길 수 있습니다.

필자가 알아야 할 유일한 이유는 select 함수에 대한 것입니다. select 함수는 확인해야하는 가장 높은 파일 설명자를 전달하면 속도가 빨라집니다.

(1) IEEE 표준을 따르는 구현은 파일에 대해 사용되지 않은 가장 낮은 디스크립터를 보장하지만 소켓에는 적용되지 않을 수 있습니다. 모든 구현이 open()에 대한 IEEE 표준을 따르는 것은 아니므로 휴대용 소프트웨어를 작성하는 경우에는 의존하지 않는 것이 가장 좋습니다.

+5

open()을 호출하면 사용 가능한 가장 낮은 파일 설명자가 반환됩니다. http://www.opengroup.org/onlinepubs/009695399/functions/open.html 소켓에 대한 보증은 없습니다. –

+0

알림 및 특정 참조에 감사드립니다. –

+4

"IEEE 표준"은 POSIX입니다. 이것을 언급하는 것이 가치가 있습니다 ... –

4

C 스펙, OS에 맞는 스펙에서 찾을 수있을 것 같지 않습니다. Linux에서의 나의 경험은 항상 가장 낮았습니다.

2

다른 질문으로이 문제를 해결해 보겠습니다. 왜이 문제가 발생합니까? stdin/stdout/stderr를 확인하거나 수학을 사용하지 않는 한 파일 설명자를 다른 것과 비교해서는 안됩니다. 그것이 int에 들어 맞는 한 (그리고 그 보장 된) 모든 것이 여러분이 정말로 알아야 할 것입니다.

+1

사실이 아닙니다. 그것을 select와 함께 사용하면'fd_set' 객체에 적합해야합니다. 그리고 POSIX는 파일 디스크립터를 순차적으로 할당해야하기 때문에 비슷한 방식으로 파일 디스크립터 세트를 저장하기 위해 자신 만의 비트 배열 객체를 사용할 수도있다. –

0

Steve M이 맞습니다. C에는 소켓에 대한 개념이 없으며 파일 I/O 함수는 디스크립터가 아닌 FILE 객체에 대한 포인터를 사용합니다.

+0

C에는 실제로 파일을 읽는 두 가지 방법이 있습니다. 하나는 FILE 개체이고 다른 하나는 파일 설명 자입니다. –

+1

파일 디스크립터 기반 방식은 C의 일부가 아닌 Unix API에서 제공하는 시스템 호출 인터페이스입니다. – wnoise

0

@aib open(), close(), lseek(), read(), write() 모두 파일 설명자를 사용합니다. I/O 스트림을 거의 사용하지 않습니다.

@Kyle select()와 같은 문 때문에 중요합니다. 가장 높은 디스크립터를 아는 것은 성능을 향상시킬 수 있습니다.

0

C 스펙에 따르면 구현에 따라 다릅니다. 유닉스 구현을보고 있다면, open (2)의 man 페이지는 "성공적인 호출로 반환 된 파일 디스크립터는 현재 프로세스를 위해 열지 않은 가장 낮은 번호의 파일 디스크립터가 될 것이다"라고 말한다.

특정 설명자를 특정 파일에 첨부하려는 경우 유용합니다. stderr을/dev/null로 리디렉션하려고한다고 가정 해보십시오. 비슷한 것

닫기 (2); open ("/ dev/null", O_WRONLY);

해야합니다. 물론 열린 채로 반환 된 fd를 캡처하여 2인지 확인해야합니다.

+0

또는'dup2'를 사용하여 의도 한 파일 설명자에 올바른 스트림을 할당하십시오. – LnxPrgr3

+1

프로그램이 스레드를 사용하고 다른 스레드가 수행하는 작업을 엄격하게 제어하지 못하면 'dup2'만 안전한 방법입니다. 'close' /'open'은 다른 쓰레드가 파일 디스크립터를 얻는 경쟁 조건을 발생시킨다. –