我正在运行具有以下原型的Linux 3.2内核:ioctl
long ioctl(struct file *f, unsigned int cmd, unsigned long arg);
我注意到无论从相应用户空间函数传递给的实际数据类型如何,arg
它总是无符号长。ioctl
示例ioctl
通常显示以下实现(source):
typedef struct
{
int status, dignity, ego;
} query_arg_t;
#define QUERY_GET_VARIABLES _IOR('q', 1, query_arg_t *)
static long my_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
{
query_arg_t q;
switch (cmd)
{
case QUERY_GET_VARIABLES:
q.status = status;
q.dignity = dignity;
q.ego = ego;
if (copy_to_user((query_arg_t *)arg, &q, sizeof(query_arg_t)))
{
return -EACCES;
}
break;
default:
return -EINVAL;
}
return 0;
}
请注意,需要query_arg_t *类型,因此应用了强制转换:(query_arg_t *)arg
但是,这是否违反了严格的别名规则,因为arg
类型为unsigned long而强制转换为query_arg_t *?