C语言 VxWorks将结构地址传递给ioctl



我试图将结构的地址传递为ioctl()的第三个参数。当我试图在my_ioctl()内读取它们时,我无法访问结构成员。在将地址传递给ioctl()之前,我先读取地址,然后将my_ioctl()内部的地址强制转换为结构指针类型,并将其分配给新的指针变量。然后,当我再次读取地址时,它与我最初传递给它的地址不匹配。

MY_STRUCT struct;
MY_STRUCT *pStruct = &struct;  
printf("address before ioctl: x%08Xn", (int)pStruct);
if(ioctl(fd, command, (int)pStruct) < 0)

。..

then in the driver


int my_ioctl(struct dev *pDev, int cmd, int arg)
MY_STRUCT *pStruct = (MY_STRUCT*)arg;
printf("addr in ioctl: x08Xn", pStruct);

switch(cmd) 

。..

为什么地址在变?

将指针强制转换为整数是一种不好的做法。例如,在x86_64操作系统上,指针长度为8字节,整数长度为4字节…

根据本文档,ioctl()的第三个参数具有适合目标体系结构的类型:

第三个参数是可选的,推荐_Vx_ioctl_arg_t类型,然后对于VxWorks 32位,这是一个32位类型,对于VxWorks 64位,这是一个64位类型。

几个月前我也遇到过同样的问题。这里的问题很可能是一些IOCTL命令被阻塞/已经被vxWorks使用(在版本7 SR620上测试)。

检查是否得到cmd代码64。如果你得到一个64作为cmd,你的地址很可能是垃圾。

同事检查了通过的ioctl命令,发现命令2,3,7,14,15,19,20,21,…应该通过,但不保证这些命令代码为您工作。

最新更新