Linux 용 문자 장치 드라이버를 작성했습니다.char 장치 드라이버를 "cat"하려고 할 때 오류 메시지가 나타나는 이유는 무엇입니까?
메시지가 커널 공간에 저장되는 간단한 메시지 저장/검색 시스템입니다.
echo "message 1" > /dev/mydevice
을 다음 메시지는 큐에 저장됩니다
cat /dev/mydevice
으로 메시지를 검색 :
나는 같은 것을 할 수 있어야합니다.
나는 하드 (메시지가 "안녕하세요"입니다), 나는 다음과 같은 명령 줄 출력을 얻을 테스트에서 코딩 된 메시지를 검색 할 때 :
cat /dev/mydevice
hellocat: /dev/mydevice: Resource temporarily unavailable
그래서 나는 헬로 메시지가 의도대로를 , 그러나 분명히 내가 옳지 않은 것을하고있다.
여기에는 장치 읽기를 처리하는 함수가 있습니다. 이 (signified by read
returning 0 인) EOF에 도달 할 때까지
static ssize_t device_read(struct file *filp, char *buffer,
size_t length, loff_t * offset) {
unsigned long result;
int message_size;
struct message_list* message = pop_message(&global_message_list);
if (!message) return -EAGAIN;
message_size = message -> message_length;
result = copy_to_user(buffer, message -> message, message_size);
printk(KERN_ALERT "res: %lu, msg_size: %d, len: %d\n", result, message_size, length);
if (result == 0) return message_size;
else return message_size - result;
}
'cat'은 EOF에 도달 할 때까지 계속 읽으 려한다고 생각합니다 ('read'는 0을 반환합니다). 이 경우 메시지가 없어지면 즉시 'EAGAIN'으로 이동합니다.대기열에있는 "hello"뒤에 빈 메시지를 하드 코딩 해보고 그 메시지가 제대로 작동하는지 확인하십시오. (이것이 실제로 문제가된다면 아마도 가장 좋은 해결책은 아니지만 테스트하기가 더 쉽습니다. 한 가지 방법으로 thread-safe 방식으로 정확히 하나의 메시지를 각 리더에 반환하는 것은 어려울 것입니다.) –
더 이상 메시지가 없을 때 EAGAIN을 반환하는 것은 내 과제에 대한 요구 사항의 일부입니다. 나는 EOF를 위해 0을 반환 할 필요가 있음을 감안할 때이 점을 어떻게 극복 할 수 있을지 조금 혼란 스럽다. – toastedDeli
@DanielH 또한 고양이가 내 읽기 기능을 여러 번 부르는 것을 의미합니까? 나는 전통적으로 읽은 바이트 수를 반환했다고 생각했다. – toastedDeli