2014-02-12 1 views
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"); 
} 
} 

Однако, я не могу получить доступ к массиву структуры из пользовательского пространства приложения.

+0

Вы определили my_ioctl и почему? – Chinna

+0

my_ioctl() находится в пространстве ядра, ioctl() отображается, когда вызывается fd = open (имя_файла, O_RDWR). – Babbit

+1

@Babbit 'q' требует выделения памяти –

ответ

0

[решаемые Шакти Кумара] В общем заголовке:

добавить

#define MAX_OBJ 50 

typedef struct { 
int num_items; 
queryForItems items[MAX_OBJ]; 
} query_arg_t; 

В драйвере

case QUERY_GET_VARIABLES: 
     q = kmalloc(sizeof(query_arg_t), GFP_KERNEL); 

    q->num_items = 3; 
    memcpy(q->items, queryForItems, sizeof(queryForItems) * q->num_items); 

     if (copy_to_user((query_arg_t *)arg, q, sizeof(query_arg_t))) { 
      return -EACCES; 
     } 
     break; 

В приложении пользователя:

query_arg_t *q; 
q = malloc(sizeof(query_arg_t)); 

if (ioctl(fd, QUERY_GET_VARIABLES, q) == -1) 
{ 
    perror("query_apps ioctl get"); 
} else {  
printf("=====================\n"); 

printf("option: %s \n", q->items[i].status);