2010-07-13 3 views
10

POSIX 시스템에서 파일 설명자가 검색 가능한지 여부를 결정하는 이식성있는 방법이 있습니까? 내 생각은 lseek(fd, 0, SEEK_CUR);을 사용하고 반환 값이 -1인지 확인하지만 이것이 false negative 또는 false positives를 줄 수 있는지 확신 할 수 없습니다. fstat을 사용하고 어떤 유형의 파일을 검색 가능/비 선택할 수 있는지에 대한 가정은 좋은 생각처럼 들리지 않습니다. 다른 아이디어?파일 설명자가 검색 가능한지 확인하는 방법은 무엇입니까?

답변

10

lseek 방법이 적당합니다. 그것은 틀린 부정을 야기 할 수 없습니다. 만약 그렇다면 구현에 심각한 오류가 있습니다. 또한, POSIX spec에 따르면, 디스크립터가 파이프, FIFO 또는 소켓 인 경우 이론적으로는 오탐 (false positive)이 없어야합니다. 유일한 문제는 다른 시스템이 사양을 얼마나 잘 준수하고 있는지입니다. 그러나, 다른 어떤 방법들처럼, 그것이 무엇이든, 분명히 이것보다 덜 휴대 할 수있을 것 같습니다.

2

stat 구조체의 mode 필드에서 fstat(), S_ISREG 매크로를 사용하여 일반 파일인지 여부를 확인할 수 있습니다. 정규 파일 인 per definiton은 탐색 가능하지만 "비정규"(특수) 파일은 (탐색 할 수있는 특수 파일이 있는지 모르겠습니다).

그래, lseek() 및 errno == ESPIPE의 반환 값을 확인해야합니다. 원칙적으로 the effect of lseek() on devices which are incapable of seeking is implementation-defined이므로 비강 대몬에주의하십시오.

+3

하드 드라이브와 같은 블록 장치를 검색 할 수 있습니다. 어쩌면 문자 장치 일 수도 있지만 확실하지 않습니다. – Thomas

+1

실제로 검색 할 수없는 일부 장치는 찾기에 실패하지 않습니다 (리눅스에서는 검색에 실패했지만 누군가 동작에 의존하는 사용자 공간 앱을 발견했습니다 ...) – Spudd86

+0

True; 일부 문자 장치 드라이버는 단순히 seek()를 무시하고 자동으로 반환됩니다. –

관련 문제