日期:2014-05-16  浏览次数:20907 次

求救啊 ioctl函数
int ioctl(struct inode *inod,struct file * filp, unsigned int cmd,unsigned long arg)

如果我帮cmd 命令用 _IOWR(type,nr,size) 定义为双向传输, 那么这个arg 参数,即可以传入值,也可以读出值吗?
  那怎么检测它的安全性了
用这个access_ok 检测的时候,它一次只能检测VERIFY_WRITE 或 VERIFY_READ ,那我对同地址检测两次 (因为是双向传输,所以 要检测读 和写 时的地址安全性 即检测两次)好像检测通不过。

 if (_IOC_DIR(cmd) & _IOC_READ)
  err = !access_ok(VERIFY_WRITE, (void *)arg, _IOC_SIZE(cmd));
  else if (_IOC_DIR(cmd) & _IOC_WRITE)
  err = !access_ok(VERIFY_READ, (void *)arg, _IOC_SIZE(cmd));
  if (err) 
  return -EFAULT;

我想问一下双向传输 中 就用 arg 参数就可以了吗, 即应用程序中,通过该系统调用ioctl中的arg参数 传入一个值,然后还能从arg 参数中得到返回值(即ioctl仅仅调用一次,就可以通过arg 传入一个值,然后还可以从arg 得到一个返回值)?
是这样吗???
  双向传输怎么用啊

------解决方案--------------------
" 即应用程序中,通过该系统调用ioctl中的arg参数 传入一个值,然后还能从arg 参数中得到返回值(即ioctl仅仅调用一次,就可以通过arg 传入一个值,然后还可以从arg 得到一个返回值)?
是这样吗???"

应用程序通过该系统调用ioctl中的arg参数 传入一个值,然后,内核处理函数做赋值操作,然后,你的应用程序再去读这个值就可以了。呵呵。不放心的话,让应用程序sleep一秒。

这是我的代码,工程应用没问题。

......
rev = ioctl(fd,FB_SBR_IOCTL_PRIORITY,pFBSBRPRIORITY);
sleep(1);
 
for( i = 0; i < pFBSBRPRIORITY->vlan_pri_number ; i++)
printf("\n the vlan id is %d, and the priority value is %d.", 
pFBSBRPRIORITY->vlan_priority_list[i].vlan, pFBSBRPRIORITY->vlan_priority_list[i].vlan_priority);
.......