poll_wait 예제

예를 들어 사용자 프로그램의 다음 코드 줄에서 stdin 입력 파일에 대한 현재 프로세스에 대한 비동기 알림을 사용하도록 설정합니다. 2.0 API를 사용하는 스컬 버전은 이러한 방식으로 verify_area를 호출합니다. 이 문제는 호출이 실제로 오랜 시간 동안 차단할 수 있을 때 발생합니다. 예를 들어, 아직 작성기가 없는 FIFO를 열거나 보류 중인 잠금이 있는 디스크 파일에 액세스할 수 있습니다. 일반적으로 외부 이벤트를 기다릴 필요 없이 장치를 열면 성공하거나 실패합니다. 그러나 장치를 열려면 긴 초기화가 필요하며 장치 초기화를 시작한 후 플래그가 설정된 경우 -EAGAIN(”다시 시도”)으로 즉시 반환하여 열린 메서드에서 O_NONBLOCK을 지원하도록 선택할 수 있습니다. 드라이버는 파일 잠금과 유사한 방식으로 액세스 정책을 지원하기 위해 차단 열기를 구현할 수도 있습니다. 이 장의 후반부에서 ”EBUSY에 대한 대안으로 열리는 차단” 섹션에서 이러한 구현 중 하나를 살펴보겠습니다. 두 조건 중 하나와 일치하는 함수를 재진입해야 합니다. 첫째, 스케줄을 호출하는 경우 sleep_on 또는 wake_up을 호출할 수 있습니다. 둘째, 사용자 공간에 대한 액세스가 페이지 오류일 수 있으므로 사용자 공간으로 데이터를 복사하는 경우 커널이 누락된 페이지를 처리하는 동안 프로세스가 절전 모드로 처리됩니다. 이러한 함수를 호출하는 모든 함수도 재진입이어야 합니다.

예를 들어 sample_read가 다시 차단할 수 있는 sample_readdata를 호출하는 경우 sample_read는 절전 모드로 전환된 프로세스를 대신하여 이미 실행 중인 동안 다른 프로세스가 호출하는 것을 방해하지 않으므로 sample_read뿐만 아니라 sample_getdata이어야 합니다. 예를 들어, setterm 프로그램은 이스케이프 시퀀스를 인쇄하여 콘솔(또는 다른 단말) 구성에서 작동합니다. 이 동작은 장치의 원격 제어를 허용하는 장점이 있습니다. 제어 프로그램은 데이터 스트림의 간단한 리디렉션이 구성 작업을 수행하기 때문에 제어 장치가 아닌 다른 컴퓨터에 거주할 수 있습니다. 당신은 이미 ttys와 함께이것에 익숙하지만, 기술은 더 일반적입니다. 폴링 상태의 변경을 나타낼 수 있는 하나 이상의 대기 큐에서 poll_wait를 호출합니다. 때로는 장치 자체에 제어 시퀀스를 작성하여 장치를 제어하는 것이 더 잘 수행됩니다. 이 기술은 예를 들어 콘솔 드라이버에서 커서를 이동하거나 기본 색상을 변경하거나 다른 구성 작업을 수행하는 데 소위 이스케이프 시퀀스를 사용하는 데 사용됩니다. 이러한 방식으로 장치 제어를 구현하면 사용자가 장치를 구성하기 위해 빌드된 프로그램을 사용하거나 작성할 필요 없이 데이터를 작성하는 것만으로 장치를 제어할 수 있다는 이점이 있습니다. 대기 대기열 사용의 예로, 다른 사람이 장치에 쓸 때 장치를 읽을 때 절전 모드로 처리하는 프로세스를 넣고 깨어나려고 한다고 가정해 보겠습니다.

/dev/scullpriv 장치 노드는 스컬 패키지 내에서 가상 장치를 구현합니다. scullpriv 구현은 가상 장치에 액세스하기 위한 키로 프로세스의 제어 tty의 작은 숫자를 사용합니다. 그럼에도 불구하고 키에 정수 값을 사용하도록 소스를 쉽게 수정할 수 있습니다. 각 선택은 다른 정책으로 이어집니다. 예를 들어, uid 리드를 사용하면 각 사용자에 대해 다른 가상 장치가 생성되고 pid 키를 사용하면 액세스하는 각 프로세스에 대해 새 장치가 만들어집니다. 일반적으로 폴링 메서드는 더 많은 데이터가 사용 가능하지 않거나 사용 가능하지 않은 경우 POLLHUP를 반환해야 합니다. 위의 예는 이 규칙의 예외입니다. 장치가 하드웨어 개체에 바인딩되지 않은 경우에만 이 작업을 명확하게 할 수 있습니다. 스컬은 이러한 `소프트웨어`장치의 예입니다.

Kommentarer inaktiverade.