2015-04-03 64 views
0

最近,我在练一个简单的ioctl驱动程序有三个命令:打印,获取,设置为什么有些ioctl病例总是失败?

在IOCTL switch语句,它看起来像这样的伪代码:

switch (cmd) { 
case "print": 
    break; 
case "get": 
    break; 
case "set": 
    break; 
default: 
    break; 
} 

但是,打印情况可以正确执行,而get和set case则不正确。 因此,我得到的输出

[ 2682.940000] mymem_ioctl: <---Switch Command =27395---> 
[ 2682.940000] getdata=80046b01 80046b01setdata=40046b02 40046b02print=6b03 6b03 
[ 2682.950000] <---ORG IOCPRINT :test_var=-1095999702---> 
[ 2682.960000] <---IOCPRINT complete:test_var=111---> 
cmd:6b03, arg=10 success 
SETDATA cmd:40046b02 
ioctl_setdata error 
GETDATA cmd:80046b01 
ioctl_getdata error 

我试图解码ioctl命令,但一切看起来不错。

getdata=0x80046b01 => 1000 0000 0000 0100 .... 
setdata=0x40046b02 => 0100 0000 0000 0100 .... 
print=0x6b03 

0100 is size of int 
6b is my magic number 'k' 
01,02,03 is the number of function(get,set,print) 

我不知道为什么......任何人都可以帮忙吗?

内核版本2.6.38是,以下是我的代码

+0

请更新您的问题以显示有效的代码。 'case“print”:'不会编译;你不能使用字符串作为案例标签。 – 2015-04-04 19:30:41

+0

抱歉让一个模棱两可的错误....它只是一个说明工作流程的示例代码。 – 2015-04-05 16:39:50

+0

你打算更新这个问题吗? – 2015-04-05 18:55:04

回答

1

@line 14

_IOC_NR(cmd)!=MYMEMDEV_IOC_MAXNR 

也许应该检查

_IOC_NR(cmd) <= MYMEMDEV_IOC_MAXNR 

另外,我求求你们,请按照内核编码风格。这会让我们更容易以这种方式提供帮助。
http://lxr.free-electrons.com/source/Documentation/CodingStyle

+0

我刚刚在几个小时前解决了这个问题。这正是你所说的。一个愚蠢的错误。感谢有关编码风格的信息。 :) – 2015-04-05 16:50:10