_IOR第三个参数的实际含义

时间:2019-05-29 11:45:26

标签: c linux linux-kernel

我有一个驱动程序和守护程序,使用 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_ATEST_GET_NUM_B都能正常工作,不会发生崩溃。 我的问题是哪一个是正确的,还是两者都正确?

_IOR(type,nr,size)的大小是ioctl(fd, TEST_GET_NUM_A/B, &num_keys)中第3个参数的大小,还是从内核传递到用户空间的数据的大小?

1 个答案:

答案 0 :(得分:2)

类型的大小成为ioctl数字的一部分。这是为了在内核和用户空间意外使用不同类型(或相同类型的不同定义)时捕获错误。

但是该字段对ioctl的行为没有影响(除非驱动程序明确读取了它)。