programing

*nix select 및 exceptfds/errorfds semantic

newsource 2023. 6. 9. 22:04

*nix select 및 exceptfds/errorfds semantic

syscall을 선택하면 읽기/쓰기 가능한 fds와 파일 설명자의 "예외"를 보기 위해 3개의 파일 설명자 세트가 사용됩니다.

셀렉트 맨 페이지에는 다음에 대해 자세히 나와 있지 않습니다.exceptfd설명자 집합입니다.파일 설명자에 대해 어떤 종류의 예외를 알릴 수 있으며 어떤 용도로 사용됩니까?

설명자 유형에 따라 다를 수도 있습니다TCP 소켓, 파이프, 패티 등).어떤 종류의 오류에 대해 더 많은 정보를 가지고 있는 사람?select다양한 종류의 설명자에 대해 보고할 수 있습니까?

때때로 오류를 감지하기 위해 exceptfds가 필요하다고 생각되지만, 그것은 잘못된 생각입니다.오류는 redfds로 플래그가 지정됩니다.POSIX에 필요한 경우(파라미터 errorfds라고도 함) 오류가 exceptfds에서도 플래그가 지정되는지 여부는 OS에 따라 다릅니다.실제로 이 매개 변수는 예외적인 조건에 관심이 있는 경우에만 필요하지만 이러한 조건을 탐지할 필요가 있는 경우는 거의 없습니다.

예외적인 조건으로 적합한 것은 파일 설명자의 종류에 따라 다르지만, 지금까지 가장 일반적으로 사용되는 것은 TCP 소켓이며, 여기서 대역 외 데이터는 다음을 사용하여 읽을 수 있음을 나타냅니다.recv()와 함께MSG_OOB플래그. 그러나 TCP 대역 외 데이터에는 여러 가지 특이점(예: 1바이트만 처리할 수 있음)이 있기 때문에 거의 사용되지 않습니다.

최근 Linux 커널에서는 except fds를 사용하여 특정 sysfs 특성이 변경되는 시기를 감지할 수 있습니다.속성의 현재 값은 아래의 적절한 파일을 읽음으로써 읽을 수 있습니다./sys그리고 aselect()속성이 변경될 때 파일 설명자에 exceptfds 플래그가 표시됩니다.그러나 현재는 일부 특성과 마운트 변경에 대해서만 작동합니다./proc/mounts).

또한 일부 장치 드라이버는 exceptfds를 사용하여 특정 장치별 조건에 플래그를 지정합니다.

맞습니다, 파일 설명자에서 참조하는 장치의 유형에 따라 다릅니다.소켓, FIFO, 직렬 포트 등에 따라 다릅니다.

man 페이지에서 read()를 확인합니다.아래쪽(적어도 OS X의 경우)에는 여러 장치에 대해 발생할 수 있는 다양한 오류가 나열되어 있습니다.write()도 마찬가지입니다.

소켓, FIFO 및 기타 IPC 메커니즘에 대해서는 Unix Network Programming, Volume 1 및 2를 참조하십시오. IIRC는 다양한 오류 조건에 대해 어떤 종류의 오류를 예상해야 하는지 설명합니다.

저는 FIFO들과 함께 이 길을 걸어본 적이 있습니다.저는 생산자와 소비자가 FIFO의 각 끝과 상호작용할 수 있는 모든 방법을 브레인스토밍하고 각 상황에 대한 테스트 사례를 작성했습니다.여러 가지 오류 조건을 모두 발견할 수 있는 좋은 방법입니다(심심하긴 하지만).하지만 저는 많은 것을 배웠고 궁극적으로 코드는 이제 작동합니다.

언급URL : https://stackoverflow.com/questions/1342712/nix-select-and-exceptfds-errorfds-semantics