【发布时间】:2019-05-29 22:33:46
【问题描述】:
我有一个驱动和守护进程,守护进程访问驱动使用ioctl,我对_IOR的第三个参数有点困惑:
#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
我有一些代码如下, ioctl cmd 定义:
#define TEST_GET_NUM_A _IOR(TESTIO, 0x01, uint8_t *)
#define TEST_GET_NUM_B _IOR(TESTIO, 0x02, uint8_t)
ioctl 在驱动程序中:
case TEST_GET_NUM_A:
rc = put_user(data->num_keys, (uint8_t __user *) arg);
break;
case TEST_GET_NUM_B:
rc = put_user(data->num_keys, (uint8_t __user *) arg);
break;
ioctl 在守护进程中:
uint8_t num_keys = 0;
rc = ioctl(fd, TEST_GET_NUM_A/TEST_GET_NUM_B, &num_keys);
if (rc < 0) {
ALOGE("ioctl failed %d", rc);
close(fd);
return rc;
}
TEST_GET_NUM_A 和 TEST_GET_NUM_B 都运行良好,不会发生崩溃。
我的问题是哪一个是正确的,还是两者都正确?
_IOR(type,nr,size) size 是指ioctl(fd, TEST_GET_NUM_A/B, &num_keys) 中第三个参数的大小,还是指从内核传递到用户空间的数据大小?
【问题讨论】:
标签: c linux linux-kernel