0
В общем заголовке, я определение, как-структуру:не в состоянии получить доступ к массиву структуры из пользовательского пространства приложения
#define query_arg_t queryForItems
typedef struct {
char item[50];
char status[10];
} queryForItems;
В драйвере ядра, мы определяем:
// инициализировать
queryForItems queryForItemsArray[] = {
{
.item = "A",
.status = "TRUE"
},
{
.item = "B",
.status = "TRUE"
},
};
Использование IOCTL в драйвере
static long my_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
{
query_arg_t *q;
switch (cmd)
{
case QUERY_GET_VARIABLES:
memcpy(&q, (&queryListForItems), sizeof(queryForItemsArray));
if (copy_to_user((query_arg_t *)arg, &q, sizeof(query_arg_t))) {
return -EACCES;
}
break;
:
В приложении пользователя, мы определим функцию ПОЛУЧИТЬ как:
void get_vars(int fd)
{
query_arg_t *q;
//q.info = kmalloc(sizeof(???), GFP_KERNEL); // may require malloc
if (ioctl(fd, QUERY_GET_VARIABLES, &q) == -1)
{
perror("query_apps ioctl get");
} else {
printf("=====================\n");
printf("option: %s \n", q[1].Item);
printf("=====================\n");
}
}
Однако, я не могу получить доступ к массиву структуры из пользовательского пространства приложения.
Вы определили my_ioctl и почему? – Chinna
my_ioctl() находится в пространстве ядра, ioctl() отображается, когда вызывается fd = open (имя_файла, O_RDWR). – Babbit
@Babbit 'q' требует выделения памяти –