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

如何用ioctl 读写字符串??
我要写一个驱动,要通过ioctl来传递字符串,(字符串的长度不知道,是变化的,字符串最大长度可以限制为512字节, 若用户写入的过多, 要求报错,不让其写入),
分别要求能在应用程序中,调用ioctl能来写入字符串, 和调用ioctl能来读出字符串. (通过两个命令CMD_SET, CMD_GET, 写入多少字符,读取多少字符,全由应用控制)
该怎么做啊?

我自己的一些思路及问题:

是定义一个结构体吗?

typedef struct _st_data 
{
  int nLen;
  char *chrData;
} st_data;

那样的话,

#define CMD_SET _IOW('M', 0, st_data)
#define CMD_GET _IOR('M', 0, st_data)

(上面这两个定义对吗?)

写入时,应用侧定义好这样一个变量(mystdata),赋好值,然后调用 ioctl(fd, CMD_SET, &mystdata), 在驱动中,调用copy_from_user, 可从ioctl的arg中获得写入的字符串.

可是读取的时候,有点搞不懂了, 在ioctl的实现中,copy_to_user, 可是读的时候, 驱动并不知道这里该读多少长度??!!



还有弱弱地问一下,下面这样的代码对吗?
int test_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
  st_data *tmpstdata;

  .......
  switch(cmd) 
  {
  case CMD_GET:
  tmpstdata = (st_data*) arg; //***
  if (tmptdata->nLen > 0) { //***
  .....
  }
   
  copy_to_user(.....)
  }
}

上面注释为 //*** 的两行对不对呀? 是不是在没有copy_to_user()之前,不能这样操作? copy_to_user() 一定是要整个copy这个结构,而不能只copy这个结构中的 chrData 分量吧?

我刚开始学,很多不懂,望高人指点! 谢谢!

------解决方案--------------------
建议看一下

<<linux device driver>〉

里面有一节是专门介绍ioctl的


------解决方案--------------------
ioctl最好别传字符串..因为那样降低很多效率,同时容易出错,违背了ioctl的简易性

“我要写一个驱动,要通过ioctl来传递字符串”

最好用read()实现,如果有多个可以用ioctl()修改驱动的标志,再调用read()区分