ioctl 호출이 차단되나요?

ioctl 호출이 차단되나요?

libgpiod의 인터페이스를 중심으로 몇 가지 코드를 작성 중입니다. 예를 들어, 높은 레벨을 출력하도록 라인을 설정하고 싶습니다.후드, libgpiod는 해당 라인에 대해 커널이 제공한 fd를 연 다음 ioctl(fd, GPIO_V2_LINE_SET_VALUES_IOCTL, ...).

내 질문은 다음과 같습니다

  • 이 특정 ioctl()호출( GPIO_V2...매개변수 포함)이 이론적으로(아마도) 다음으로 끝날 수 있습니까?글쓰기어떤 파일 설명자라도 가능합니까?

  • ioctl()이론적으로 통화는 일반적으로 차단됩니까? 예를 들어, 첫 번째 요청 라인에는 ioctl()칩의 fd도 포함됩니다. I2C는 어떻습니까 ioctl()?

  • fd차단하는 경우 struct() 줄의 기본 항목 이 이벤트 루프(예: libuv와 같은 추상 이벤트 라이브러리) line->fd_handle->fd에서 기다려야 하는 항목입니까 ?epoll()

나는 연구를 통해 이 질문에 대답하려고 했지만 (a) "ioctl"과 "blocking"의 조합을 검색하면 다음과 같은 결과만 제공됩니다.환경fd 블록을 수행하고 (b) 내가 찾을 수 있는 매뉴얼 페이지나 커널 문서에는 없습니다.

답변1

  1. GPIO_V2_LINE_SET_VALUES_IOCTL충분히 안전한 것 같습니다. 의도된 용도에 적합합니다.ioctl, "특수 파일의 하위 수준 장치 매개변수 조작". 구현linereq_set_values, 잠금을 획득하지만 잠금이 무기한 차단될 수 있다고 생각하지 않습니다(해당 사용자는 모두 차단하지 않습니다).

  2. 이론적으로ioctl, s는 주로 드라이버를 구성하는 데 사용되므로 비차단이 될 것으로 예상할 수 있습니다 . 그러나 일부 ioctl는 그보다 훨씬 더 많은 일을 합니다. 예를 들어,FICLONERANGE그리고FICLONE실제 I/O의 경우 더 나쁜 점은 일부 네트워크 파일 시스템(예: NFS v4.2)의 지원을 받기 때문에 무기한 차단될 수 있다는 것입니다.

  3. 위의 1번 항목을 참조하세요.

답변2

첫째, GPIO uAPI는 ioctl()동기식입니다. 즉, 작업이 완료될 때까지 반환되지 않습니다. 비동기식이 아니므로 작업을 시작하고 완료 알림을 기다릴 수 있습니다.

따라서 세 번째 질문에는 GPIO uAPI가 완료되기를 기다리는 fd가 없습니다. 호출 스레드는 ioctl()작업이 완료될 때까지 반환되지 않습니다.ioctl()

(uAPI에서 fds의 가독성은 s와 관련이 없지만 ioctl()비동기 이벤트가 발생하여 파일에서 이벤트 세부 정보를 읽을 수 있음을 나타냅니다. 라인 요청 fds의 경우 엣지 이벤트입니다. 칩 fds의 경우 회선 요청 상태 변경 - 요청, 해제 또는 재구성 여부.

ioctl()첫 번째 질문에 대한 나의 초기 반응은 예를 들어 GPIO uAPI가 GPIO_V2_LINE_SET_VALUES_IOCTL실제로 비차단이라는 것입니다. 공유 상태를 덮어쓰는 뮤텍스가 포함될 수 있지만 궁극적으로 하드웨어를 제어하는 ​​레지스터에 대한 쓰기를 보호하고 이러한 쓰기는 거의 즉시 반환되므로 모든 경합은 일시적이고 오버헤드는 사용자 공간의 스레드 간 컨텍스트 전환보다 적습니다. 이를 고려하면 루프 내에서도 직접 호출할 수도 있습니다 epoll().

이는 SOC 및 마이크로 컨트롤러에서 직접 호스팅되는 GPIO의 경우 해당될 수 있지만 I2C, SPI 또는 기타 수단을 통해 연결된 GPIO 확장 칩의 경우 ioctl()해당 트랜잭션이 완료될 때까지 반환되지 않습니다. 소요 시간은 버스 등에 따라 다르며 대기 시간이 중요한지 여부는 애플리케이션에 따라 다릅니다. 이벤트 루프를 무기한 차단하지는 않지만 원하는 것보다 오래 지속될 수 있습니다.

따라서 첫 번째 질문에 대답하자면, 무기한 차단을 의미한다면 아니요, 무기한 차단해서는 안 됩니다. 하지만일부 경우에완료하는 데 꽤 시간이 걸릴 수 있으며 이는 귀하에게 중요할 수 있습니다.

나는 이것이 두 번째 질문에도 적용된다고 생각합니다. 일반적으로 말하면 비차단으로 간주될 수 있지만 이는 특정 상황 ioctl()과 애플리케이션에 따라 다릅니다.

관련 정보