외부 클럭을 사용하여 타이밍 기능을 수행하는 커널 모듈을 작성 중입니다. 기본적으로 모듈은 시계의 펄스를 카운트하고 매번 카운트를 롤백합니다. 사용자 프로세스는 ioctl을 사용하여 특정 개수로 깨어나도록 요청할 수 있습니다. 그런 다음 몇 가지 작업을 수행하고 동일한 ioctl을 호출하여 다음 번에 같은 카운트가 나타날 때까지 기다립니다. 이 방법으로이 외부 타이밍을 사용하여 주기적으로 실행할 수 있습니다.wait_event_interruptible을 사용하여 주기적 이벤트 대기
사용할 수있는 각 예약 슬롯 (위에서 설명한대로 각 "카운트")에 하나씩 wait_queue_head_t
개의 배열을 만들었습니다. 사용자 프로세스가 ioctl을 호출 할 때 일정 슬롯과 따라서 대기열을 지정하는 ioctl 인수를 사용하여 sleep_on()
을 호출하기 만하면됩니다. 커널 모듈이 클록 펄스를 수신하고 카운트를 증가 시키면, 그 카운트에 대응하는 대기 큐를 웨이크 업한다.
나는 상태는 프로세스가 잠을해야하는지 테스트 사이를 전환 할 가능성이 있기 때문에, sleep_on()
를 사용하는 considered bad practice 것을 알고 sleep_on()
에 해당 호출. 그러나이 경우 나는 잠자기 전에 깨우기 사건이 주기적이기 때문에 그런 시험을하지 않는다. 다른 이벤트가 곧 나올 것이기 때문에 깨어있는 이벤트를 "놓친다"는 것은 중요하지 않습니다. (실제로, ioctl이 지정된 스케줄 슬롯에 매우 가깝게 호출되면 뭔가 잘못되어 다음 슬롯까지 기다리기를 원합니다. 어쨌든).
더 안전하다고 생각되는 wait_event_interruptible()
을 사용하여 보았습니다. 그러나 wait_event_interruptible
에 필요한 조건 인수는 무엇을 넣어야할지 모르겠습니다. wait_event_interruptible
는 잠자기 전에이 상태를 검사하지만 ioctl이 호출 될 때 항상 잠자기 상태로 유지하려고합니다. 잠자기 전에 깨어나 설정 한 깃발을 사용할 수는 있지만 기다림 대기열에 여러 개의 프로세스가있는 경우 작동하지 않을 수도 있습니다. 다음 프로세스가 끝나기 전에 하나의 프로세스가 플래그를 지우고 지울 수 있습니다. 깨어 났어요.
나는 이것에 대해 걱정할 권리가 있습니까? 또는 wait_queue의 모든 프로세스가 실행되기 전에 깨어나 보장되어 플래그가 지워질 수 있습니까? 이 시스템과 같은 시스템을 구현하는 더 좋은 방법이 있습니까? 실제로 sleep_on()
을 사용해도 괜찮습니까? (그렇다면 sleep_on()
버전이 인터럽트 가능합니까?)
감사합니다. 커널은 여전히'interruptible_sleep_on()'을 가지고 있기 때문에 지금 사용하고있을 것입니다. 나는 프로세스 당 플래그를 구현 한 다음 ioctl에 전달하는 것을 생각하지 않았다. 필자가 필요하다면'wait_event_interruptible()'을 사용하는 가장 좋은 방법처럼 들린다. – llakais