read() 함수
기능
응용 프로그램에서 디바이스 파일에 read를 수행했을 때 호출되는 함수로 읽기를 처리한다.
형태
#include <linux/fs.h> ssize_t read(struct file* filp, const char* buf size_t count, loff_t* fpos)
매개변수
filp: 열린 파일에 대한 연산을 위한 구조체 주소
buf: 응용 프로그램에서 전달된 데이터의 선두 구조(사용자 공간)
count: 읽고자 요청한 데이터 개수
f_pos: 파일의 위치 변수(seek 값)
반환값
정상적으로 수행했다면 처리된 데이터 개수를, 그렇지 않으면 0보다 작은 값을
반환한다. 반환값은 저수준 파일 입출력 함수인 read의 반환값을 기준으로 해야
한다.
ssize_t xxx_read( struct file* filp, const char* buf, size_t count, loff_t* f_pos) { if( !(준비된 데이터가 있는가?) ) { if( !(filp->f_flags & O_NOBLOCK) ) { // 블록 모드로 열렸다면 프로세스를 재운다. } } // 하드웨어에서 데이터를 읽는다. // inb(), outb(), ..., readb(), writeb() 함수 사용 // 또는 버퍼를 읽는다. // 사용자 공간에 데이터를 전달한다. // copy_to_user, put_user return 처리된 데이터 개수; }
write() 함수
기능
응용 프로그램에서 디바이스 파일에write를 수행했을 때 호출되는 함수로, 쓰기를 처리한다.
형태
#include <linux/fs.h> ssize_t write(struct file* filp, const char* buf, size_t count, loff_t* f_pos)
매개변수
filp: 열린 파일에 대한 연산을 위한 구조체 주소
buf: 응용 프로그램에서 전달된 데이터의 선두 구조(사용자 공간)
count: 쓰고자 요청한 데이터 개수
f_pos: 파일의 위치 변수(seek 값)
반환값
정상적으로 수행했다면 처리된 데이터 개수다. 그렇지 않다면 0보다 작은 값을
반환한다. 반환값은 저수준 파일 입출력 함수인 write의 반환값을 기준으로 해야한다.
ssize_t xxx_write( struct file* filp, const char* buf, size_t count, loff_t* f_pos) { if( !(데이터가 처리 가능한가?) ) { if( !(filp->f_flags & O_NOBLOCK) ) { // 블록 모드로 열렸다면 프로세스를 재운다. } } // 사용자 공간에 데이터를 가져온다. // copy_from_user, get_user // 하드웨어에서 데이터를 읽는다. // inb(), outb(), ... , readb(), writeb() 함수 사용 // 또는 버퍼를 읽는다. return 처리된 데이터 개수; }