当前位置: 技术问答>linux和unix
如何用ioctl 读写字符串??
来源: 互联网 发布时间:2016-02-22
本文导语: 我要写一个驱动,要通过ioctl来传递字符串,(字符串的长度不知道,是变化的,字符串最大长度可以限制为512字节, 若用户写入的过多, 要求报错,不让其写入), 分别要求能在应用程序中,调用ioctl能来写入字符串, 和调用ioct...
我要写一个驱动,要通过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 分量吧?
我刚开始学,很多不懂,望高人指点! 谢谢!
分别要求能在应用程序中,调用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 分量吧?
我刚开始学,很多不懂,望高人指点! 谢谢!
|
ioctl最好别传字符串..因为那样降低很多效率,同时容易出错,违背了ioctl的简易性
“我要写一个驱动,要通过ioctl来传递字符串”
最好用read()实现,如果有多个可以用ioctl()修改驱动的标志,再调用read()区分
“我要写一个驱动,要通过ioctl来传递字符串”
最好用read()实现,如果有多个可以用ioctl()修改驱动的标志,再调用read()区分
|
建议看一下
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。