gpt4 book ai didi

c - file_operations.write 的返回值不受尊重

转载 作者:太空宇宙 更新时间:2023-11-04 07:18:06 27 4
gpt4 key购买 nike

我正在为 linux 内核编写一个简单的 misc 设备驱动程序。在我的 file_operations.write 中,我做了一些检查并将传递的值与预定义值进行比较,如果值相等,我返回字符串长度,如果不相等,我返回 -EINVAL

问题是,即使我在离开写入之前打印返回值,它在日志中打印为 -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

最佳答案

在测试内核内容时,请始终使用尽可能低级别的用户空间 api。如果您使用的是 write()(系统调用),一切都会好起来的(您会得到错误代码)。但是你决定使用更复杂的 fwrite() 函数,它做了一些不同的事情(http://linux.die.net/man/3/fwrite):

On success, fread() and fwrite() return the number of items read or written. This number equals the number of bytes transferred only when size is 1. If an error occurs, or the end of the file is reached, the return value is a short item count (or zero).

fread() does not distinguish between end-of-file and error, and callers must use feof(3) and ferror(3) to determine which occurred.

事实上,fwrite() 不可能返回一个负值,即使它也想要(查看它的签名)。

关于c - file_operations.write 的返回值不受尊重,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23047047/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com