error: unknownfield ‘ioctl’ specified in initializer


 


异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序就根本不需要查询设备的状态,


这一点非常类似于硬件上的“中断”的概念,比较准确的称谓是“信号驱动的异步I/O”。信号是在软件层次上对中断机制的一种模拟,在原理上一个进程接收到一个信号与处理器接收到一个中断请求是一样的。


1)在把驱动从2.6.32 移植到2.6.36时 报错



/home/kernel_test/globalfifo/globalfifo.c:240:2:error: unknown field 'ioctl' specified in initializer


才发现2.6.36的file_operations结构发生了重大变化。(但基本的思想还是不变的)


取消了原有的ioctl成员,添加来新的成员



  1. long(*unlocked_ioctl) (struct file *, unsigned int, unsigned long);  
  2.   
  3. long(*compat_ioctl) (struct file *, unsigned int, unsigned long);  

2)/home/kernel_test/globalfifo/globalfifo.c:245:2:warning: initialization from incompatible pointer type


出现此种warnning 的原因  “不兼容的指针类型初始化”是你定义的函数类型与接口函数的类型不一样如 把 把返回值 long 定义成了 int


其中:


  1. ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);  
  2.   
  3. ssize_t(*write) (struct file *, const char __user *, size_t, loff_t *);  


少写const 也会引起 warning 因为在这里const所起的作用是避免函数使用指针去改变了传进来的值


 



  1. 237  
  2. 238 /*文件操作结构体*/  
  3. 239 static const struct file_operations globalfifo_fops = {  
  4. 240     .owner = THIS_MODULE,  
  5. 241     .read = globalfifo_read,  
  6. 242     .write = globalfifo_write,  
  7. 243     //.ioctl = globalfifo_ioctl,  
  8. 244     .unlocked_ioctl = globalfifo_ioctl,  
  9. 245     .poll = globalfifo_poll,  
  10. 246     .fasync = globalfifo_fasync, /*不要完了在这里也要加上 与内核联系的接口*/  
  11. 247     .open = globalfifo_open,  
  12. 248     .release = globalfifo_release,  
  13. 249 };  
  14. 250  
  15. 251 
創作者介紹
創作者 立你斯 的頭像
立你斯

立你斯學習記錄

立你斯 發表在 痞客邦 留言(0) 人氣()