struct file_operations {
   struct module *owner;

   // llseek 메소드는 파일에서 현재의 read/write의 위치를 옮기며, 새로운 위치가 (양수)값으로 리턴된다. 에러는 음수값으로 반환된다.
   loff_ (*llseek) (struct file *, loff_t, int);

   // read 메소드는 디바이스에서 데이터를 가져오기 위해서 사용한다. 여기에 NULL 값을 사용하면 read 시스템
콜은 -EINVAL(“잘못된 매개 변수”)값을 돌려 주며 실패한다. 음수값이 아닌 리턴값은 성공적으로 읽은 바이트 수를 나타낸다.
   ssize_t (*read) (struct file *, char *, size_t, loff_t *);
  
   // 디바이스에 데이터를 보낸다. NULL 값을 스면 wirte 시스템 콜에 대해서 -EINVAL을 돌려준다. 리턴값이 음수가 아니면 성공적으로 작성된 데이터의 바이트 크기이다.
   ssize_t (*write) (struct file *, const char *, size_t, loff_t *);

   // 이 함수 포인터는 디바이스 노드에 대해서는 NULL이어야 한다. 이것은 디렉토리에 대해서 사용한다.
   int (*readdir) (struct file *, void *, filldir_t);

   // 현재의 프로세스를 대기 큐에 넣는다.
   unsigned int (*poll) (struct file *, struct poll_table_strcut *);

   // ioctl 시스템 콜은 디바이스에 종속적인 명령을 만들 수 있도록한다. 커널이 fops 테이블을 참조하지 않고도 인식할 수 있는 많은 ioctl 명령이 있다.
   int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);

   // mmap은 디바이스 메모리를 프로세서의 메모리에 맵핑시키도록 요청하기 위해 사용된다. 디바이스가 이 방법을 제공하지 않으면 리턴값은 ENODEV 이다.
   int (*mmap) (struct file *, struct vm_area_struct *);

   // 이 항목이 NULL 로 되어 있으면 디바이스 open 호출은 언제나 성공적이다.
   int (*open) (struct inode *, struct file *);

   // 연린 디바이스를 닫기 이전에 모든 데이터를 쓰도록 하기 위해서 사용한다.
   int (*flush) (struct file *);

   // 노드를 닫을 때 수행된다.
   int (*release) (struct inode *, struct file *);

   // 데이터 중에서 버퍼에 있는 것은 모두 디바이스에 쓴다. 이 메소드가 지원되지 않으면 fsync 시스템 콜은 -EINVAL 리턴값을 갖는다.
   int (*fsync) (struct file *, struct dentry *, int datasync);

   // 이 동작은 FASYNC 플래그에 변화가 있는 디바이스를 확인하기 위해서 사용한다. 드라이버가 비동기 통지를 지원하지 않을 경우에 이 필드를 NULL로 두면 된다.
   int (*fasync) (int, struct file *, int);

   // 파일에 락을 걸기 위해서 사용한다.
   int (*lock) (struct file *, int, struct file_lock *);

   ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *);

   ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *);

   ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);

   unsigned long (*get_unmapped_area) (struct file *, unsigned long,
unsigned long, unsigned long, unsigned long, unsigned long);
}

참조 : http://blog.naver.com/sglinux2418?Redirect=Log&logNo=20185596

Tags: ,

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.