Я пишу простой драйвер устройства для ядра 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
Какую программу вы используете для записи в файл устройства? Можете ли вы привести пример, когда увидите вышеуказанное поведение? Кроме того, вы можете вставить значения: count и два оператора retval, которые вы видите из журнала ядра? –
Я добавил более подробную информацию. И программа, с которой я тестирую, и журналы ядра. – silentnights
Каков результат вашей «клиентской» программы? –