POSIX 시스템에서 파일 설명자가 검색 가능한지 여부를 결정하는 이식성있는 방법이 있습니까? 내 생각은 lseek(fd, 0, SEEK_CUR);
을 사용하고 반환 값이 -1인지 확인하지만 이것이 false negative 또는 false positives를 줄 수 있는지 확신 할 수 없습니다. fstat
을 사용하고 어떤 유형의 파일을 검색 가능/비 선택할 수 있는지에 대한 가정은 좋은 생각처럼 들리지 않습니다. 다른 아이디어?파일 설명자가 검색 가능한지 확인하는 방법은 무엇입니까?
10
A
답변
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이므로 비강 대몬에주의하십시오.
관련 문제
- 1. 파일 설명자가 유효한지 확인하십시오.
- 2. 서비스와 서버가 사용 가능한지 확인하는 방법은 무엇입니까?
- 3. 디렉토리가 UID로 쓰기 가능한지 확인하는 방법은 무엇입니까?
- 4. 요청 된 디렉토리에 쓰기가 가능한지 확인하는 방법은 무엇입니까?
- 5. PHP 스트림 리소스가 읽기 가능하거나 쓰기 가능한지 확인하는 방법은 무엇입니까?
- 6. 디렉토리가 win32 C/winapi에서 쓰기 가능한지 확인하는 방법은 무엇입니까?
- 7. 주어진 네임 스페이스에서 모든 개체가 serialize 가능한지 확인하는 방법은 무엇입니까?
- 8. 디렉토리가 BAT 스크립트에서 쓰기 가능한지 확인하는 가장 좋은 방법은 무엇입니까?
- 9. 정점에 도달 가능한지 확인하는 알고리즘
- 10. 포트가 사용 가능한지 확인하는 방법
- 11. 지역 연결이 가능한지 확인하는 방법
- 12. 잘못된 파일 설명자가 스레드에 realted
- 13. 네트워크 어댑터가 Windows에서 제거 가능한지 확인하는 방법
- 14. 안드로이드 장치에서 녹음이 가능한지 확인하는 방법.
- 15. Windows에 파일 확장명이 표시되는지 확인하는 방법은 무엇입니까?
- 16. 업로드하기 전에 파일 크기를 확인하는 방법은 무엇입니까?
- 17. 새 파일 (filename) 개체를 만들면 프로세스 파일 설명자가 개체와 연결됩니까?
- 18. 운영체제를 확인하는 방법은 무엇입니까?
- 19. null인지 확인하는 방법은 무엇입니까?
- 20. WinForms 앱에 인터넷 연결이 가능한지 어떻게 결정합니까?
- 21. 형식이 인스턴스화 가능한지 알아보십시오
- 22. 파일 업로드 중, 파일 종류를 확인하는 방법은 무엇입니까?
- 23. python Paramiko (SSHClient)를 사용하여 원격 파일에 쓰기가 가능한지 확인하는 방법은 무엇입니까?
- 24. 인터넷 연결이 가능한지 확인하십시오.
- 25. 주소록에서 검색 한 연락처에 전화 번호가 없는지 확인하는 방법은 무엇입니까?
- 26. 서버가 액세스 가능한지 확인하는 중 문제가 발생했습니다 (HostReachable)
- 27. 파이썬 - 약한 참조가 여전히 사용 가능한지 확인하는 방법
- 28. 형식이 호출 가능한지 여부를 확인하는 C++ 메타 함수
- 29. jsp 태그 속성이 EL에 사용 가능한지 확인하는 방법?
- 30. 배열 값이 stdclass 객체의 배열 내에서 사용 가능한지 확인하는 방법
하드 드라이브와 같은 블록 장치를 검색 할 수 있습니다. 어쩌면 문자 장치 일 수도 있지만 확실하지 않습니다. – Thomas
실제로 검색 할 수없는 일부 장치는 찾기에 실패하지 않습니다 (리눅스에서는 검색에 실패했지만 누군가 동작에 의존하는 사용자 공간 앱을 발견했습니다 ...) – Spudd86
True; 일부 문자 장치 드라이버는 단순히 seek()를 무시하고 자동으로 반환됩니다. –