2014-04-13 1 views
0

Я пишу простой драйвер устройства для ядра linux. В моем файле_operations.write Я делаю несколько проверок и сравниваю прошедшее значение с предварительно определенным значением, если значение равно. Я возвращаю длину строки. Если я не возвращаю -EINVALВозвращаемое значение из файла_operations.write не соблюдается

Проблема в том, что даже это я печатаю возвращаемое значение перед выходом из записи, и оно печатается в журнале как -22, в моей клиентской программе, которую я тестирую, и продолжаю получать количество байтов, переданных системному вызову записи. !

Ниже приведен пример из моей функции записи:

ssize_t misc_write(struct file *filp, const char __user *buff, 
      size_t count, loff_t *offp) 
{ 
    ssize_t retval; 
    pr_crit("count: %zu\n", count); 
    pr_crit("strlen(MY_UNIQUE_ID) + 1: %zu\n", strlen(MY_UNIQUE_ID) + 1); 
    printk(KERN_INFO "Inside write \n"); 
    if (count != (strlen(MY_UNIQUE_ID) + 1)) { 
      retval = - EINVAL; 
      pr_crit("retval: %i\n", retval); 
      goto out; 
    } 
    if (strncmp(MY_UNIQUE_ID, buff, count)) 
      retval = -EINVAL; 
    else 
      retval = count; 
out: 
    pr_crit("retval: %i\n", retval); 
    return retval; 
} 

Ниже мой тестовый клиент:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(int argc, char **argv) 
{ 
    char buffer[] = "0daf007211a9"; 
    char filename[] = "/dev/misctest"; 
    int string_size, write_size; 
    FILE *handler = fopen(filename, "r+"); 
    if (handler == 0) 
    { 
      printf("error openning file\n"); 
      return -1; 
    }  
    write_size = fwrite(&buffer, sizeof(char), 2, handler); 
    if (write_size < 0) 
      printf("Error"); 
    printf("write_size: %i\n", write_size); 
    return 0; 
}  

И это то, что печатается в журналах ядра:

[793868.964583] count: 2 
[793868.964593] strlen(MY_UNIQUE_ID) + 1: 13 
[793868.964596] Inside write 
[793868.964600] retval: -22 
[793868.964602] retval: -22 
+0

Какую программу вы используете для записи в файл устройства? Можете ли вы привести пример, когда увидите вышеуказанное поведение? Кроме того, вы можете вставить значения: count и два оператора retval, которые вы видите из журнала ядра? –

+0

Я добавил более подробную информацию. И программа, с которой я тестирую, и журналы ядра. – silentnights

+0

Каков результат вашей «клиентской» программы? –

ответ

3

При тестировании ядра всегда используйте как можно более низкое пользовательское пространство api. Если вы использовали write() (системный вызов), все будет хорошо (вы получите код ошибки). Но вы решили пойти с более сложной fwrite() функция, которая делает что-то другое (http://linux.die.net/man/3/fwrite):

В случае успеха, Fread() и FWRITE() возвращает количество элементов, читать или написано. Это число равно количеству переданных байтов только тогда, когда размер равен 1. Если ошибка возникает или конец файла достигнут, возвращаемое значение представляет собой короткий счетчик предметов (или ноль).

fread() не проводит различия между конечным файлом и ошибкой, а вызывающие абоненты должны использовать функции feof (3) и ferror (3), чтобы определить, что произошло.

Фактически, fwrite() не может возвращать отрицательное значение, даже если оно того захочет (проверьте его подпись).

+0

Хорошее объяснение. Я думаю, «если условие в misc_write» терпит неудачу и возвращает «-EINVAL». if (strncmp (MY_UNIQUE_ID, buff, count)) retval = -EINVAL; –

+0

Большое спасибо, теперь я могу справиться с этим, застрял там некоторое время. Извините за мой поздний ответ. – silentnights

Смежные вопросы