IT이야기

변수에 저장된 지정된 파일 설명자가 여전히 유효한지 확인하는 방법

cyworld 2022. 5. 13. 23:56
반응형

변수에 저장된 지정된 파일 설명자가 여전히 유효한지 확인하는 방법

변수 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이고events0으로 설정된 멤버 및 확인POLLNVALrevents돌아온 후가 더 효율적이다.

그렇더라도 "주어진 리소스 핸들이 여전히 유효한지 확인" 작업은 거의 항상 근본적으로 부정확하다.리소스 핸들이 해제된 후(예: fd가 해제됨)closed), 그 값은 당신이 할당하는 다음 자원에 재할당될 수 있다.사용할 수 있는 참조가 남아 있는 경우, 이전 자원이 아닌 새로운 자원으로 잘못 운용될 것이다.따라서 진정한 대답은 아마도 다음과 같다.만약 당신이 당신의 프로그램의 논리로 이미 알지 못한다면, 당신은 고쳐져야 할 주요한 근본적인 논리 오류가 있다.

당신은 그것을 사용할 수 있다.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을 참조하십시오.

건배, 플로

참조URL: https://stackoverflow.com/questions/12340695/how-to-check-if-a-given-file-descriptor-stored-in-a-variable-is-still-valid

반응형