2013-11-28 4 views
1

저는 현재 리눅스 장치 드라이버를 배우고 있습니다. 나는 단지 메모리 버퍼 인 예제 드라이버로 시작했다.연산자가 내 문자 장치에서 작동하지 않는 이유는 무엇입니까?

내 코드는 github에 있습니다. 이 잘되어 가고

# echo "Hello World" > /dev/mad 
# cat /dev/mad 
Hello World 

하지만 난 뭔가를 추가 리디렉션 연산자를 사용하는 경우 (>>), 동작은 내가 기대했던 사람이되지 않습니다 :

나는이 작업을 수행하여 내 드라이버를 테스트합니다.

# echo foo > /dev/mad 
# echo bar >> /dev/mad 
# cat /dev/mad 
bar 

나는이 오히려 예상 :

foo 
bar 

나는 llseek 콜백을 구현하고 readwrite 콜백에서 offp 돌봐했지만 여전히 작동하지 않습니다.

+1

열려있는 모드를 모두 지원하고 여러 번 쓰기가 제대로 이루어 지도록 드라이버를 작성 했습니까? –

+0

당신 말이 맞아요. 나는'open' 콜백에서 플래그'O_APPEND'의 지원을 잊어 버렸습니다. 자, 모두 잘 작동합니다! 감사합니다. – jml

답변

3

쓰기 루틴에서 O_APPEND을 처리해야합니다. >> 연산자는 O_APPEND 플래그가있는 파일을 열어 각 쓰기 작업이 끝나기 전에 운전자가 끝까지 찾도록 요청합니다. 귀하의 경우에 mad_write 루틴은 파일 플래그를 확인하고 O_APPEND이 설정되어 있으면 작성하기 전에 끝까지 찾아야합니다.

manual definition here을 참조하십시오. 예를 들어 리눅스 커널 소스를 둘러 보았지만 실제로 문자 드라이버가 거의 없다. O_APPEND. 내가 찾을 수있는 가장 좋은 예는 generic file code입니다.

+0

대부분의 문자 장치는 저장소 지향 이외의 스트림 지향적 인 특성을 가지고 있기 때문에 쓰기가 가능할 때만 자연스럽게 추가 작업이 가능합니다. –

+0

실제로, 매뉴얼을 읽은 후에'write' 콜백에서 [fix] (https://github.com/jmlemetayer/my-awesome-driver/commit/37bc4511ace03fb867aac9ec982dcd62f7e234f3)를 수행했습니다. – jml

관련 문제