У меня есть один драйвер и демон, драйвер доступа к демону, использующий 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 означает размер 3-го параметра в ioctl(fd, TEST_GET_NUM_A/B, &num_keys)
или означает размер данных, передаваемых из ядра в пространство пользователя?