如何通过ioctl 读写字符串??

sunrise41   2007-12-25 20:14 楼主
我要写一个驱动,要通过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 分量吧?

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

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复