변수에 저장된 지정된 파일 설명자가 여전히 유효한지 확인하는 방법
변수 say var에 파일 설명자가 저장되어 있다.나중에 설명자가 유효한지 확인하려면 어떻게 해야 하는가?
fdvar1= open(.....);
fdvar2 = fdvar1; // Please ignore the bad design
....
// lots of loops , conditionals and threads. It can call close(fdvar2) also.
....
if(CheckValid(fdvar1)) // How can I do this check ?
write(fdvar1, ....);
이제 var1(열린 설명자를 여전히 보유하고 있는)이 여전히 유효한지 확인하고 싶다.어떤 API가 필요하십니까?
fcntl(fd, F_GETFD)
표준적으로 가장 저렴한 방법으로fd
유효한 열린 파일 설명자.많은 것을 일괄 점검해야 하는 경우 다음을 사용하십시오.poll
시간 초과가 0이고events
0으로 설정된 멤버 및 확인POLLNVAL
에revents
돌아온 후가 더 효율적이다.
그렇더라도 "주어진 리소스 핸들이 여전히 유효한지 확인" 작업은 거의 항상 근본적으로 부정확하다.리소스 핸들이 해제된 후(예: fd가 해제됨)close
d), 그 값은 당신이 할당하는 다음 자원에 재할당될 수 있다.사용할 수 있는 참조가 남아 있는 경우, 이전 자원이 아닌 새로운 자원으로 잘못 운용될 것이다.따라서 진정한 대답은 아마도 다음과 같다.만약 당신이 당신의 프로그램의 논리로 이미 알지 못한다면, 당신은 고쳐져야 할 주요한 근본적인 논리 오류가 있다.
당신은 그것을 사용할 수 있다.fcntl()
함수:
int fd_is_valid(int fd)
{
return fcntl(fd, F_GETFD) != -1 || errno != EBADF;
}
이 포럼 기사:
int is_valid_fd(int fd)
{
return fcntl(fd, F_GETFL) != -1 || errno != EBADF;
}
fcntl(GETFL)은 파일 설명자에 대해 수행할 수 있는 작업 중 가장 저렴하고 실패할 가능성이 가장 낮은 작업일 것이다.특히 명세서에는 신호에 의해 방해될 수 없으며, 아무 곳에나 고정되어 있는 어떤 종류의 자물쇠에도 영향을 받지 않는다고 나와 있다.
설명자가 아직 유효한지 알려줄 수 있는 기능은 없는 것 같아.설명자는 일반적으로 6과 같은 작은 정수일 뿐이며 libc는 파일을 닫고 나중에 새 숫자를 열면 그 숫자를 다시 사용하도록 선택할 수 있다.
대신, 당신은 다음을 고려해야만 한다.dup()
파일 설명자를 복사하십시오.여러 곳에서 동일한 설명자를 사용하는 대신 파일 설명자를 복제하면 파일 설명자가 여전히 유효한지 쉽게 알 수 있다.다 썼을 때 원본 설명자와 중복 설명자를 모두 닫아야 한다는 것만 기억하면 된다.
내가 보기엔 아직도 같은 자원을 가리키는지 알고 싶다면, 한 가지 (완벽하지 않은) 접근법은fstat()
설명자를 연 직후에 그리고 나중에 다시 할 수 있고 결과를 비교할 수 있다. 먼저보기를 으로 시작한다..st_mode
&S_IFMT
파일 시스템 객체인가?보다.st_dev / .st_ino.
소켓인가?해보다getsockname()
getpeername()
100% 확실하진 않겠지만, 확실히 같지 않은지는 말해줄 수 있어.
나는 이 문제를 해결했다. 나는 그것이 일반적인 목적으로 사용될 수 있는지 모르지만 직렬 연결의 경우 잘 작동한다(예: /dev/ttyUSB0).
struct stat s;
fstat(m_fileDescriptor, &s);
// struct stat::nlink_t st_nlink; ... number of hard links
if( s.st_nlink < 1 ){
// treat device disconnected case
}
자세한 내용은 man 페이지 http://linux.die.net/man/2/fstat을 참조하십시오.
건배, 플로
'IT이야기' 카테고리의 다른 글
Android에서 내 응용 프로그램의 메모리 사용량을 검색하는 방법 (0) | 2022.05.14 |
---|---|
동적 위치에 Vue 구성 요소를 삽입하는 방법 (0) | 2022.05.14 |
C 함수 포인터 구문 (0) | 2022.05.13 |
Composition API를 사용하여 Vuex 지도 도움말에 액세스하는 방법 (0) | 2022.05.13 |
C에서 이중 밑줄(__const)은 무엇을 의미하는가? (0) | 2022.05.13 |