我正在用C编写一个字符设备(对于linux)。我有这个功能:
static ssize_t
device_write(struct file *file,
const char __user * buffer, size_t length, loff_t * offset)
{
int i, fd = 0;
int = bytes_written;
fd = open(file, O_WRONLY);
printk("device_write(%p,%d)\n", file, length);
for (i = 0; i < length && i < BUF_LEN-1; i++)
get_user(Message[i], buffer + i);
bytes_written = write(fd,Message,i);
Message[BUF_LEN-1] = '\0';
/* return the number of input characters used */
return bytes_written;
}
当我编译时,我得到错误:控制到达非void函数的结束。我已经仔细检查过我正在编写正确的程序,这让我疯狂。
欢迎任何帮助。
另外,稍微不相关,但是可以将char缓冲区初始化为某个字符串(例如char buffer[1000] = "HELLO"
)吗?
答案 0 :(得分:2)
该功能有很多问题
这是无效的
int = bytes_written;
也许你的意思是
int bytes_written;
您必须检查fd != -1
,open()
后面的任何代码&#34; 可能&#34;导致无效的文件描述符错误,因为您无法保证fd
是有效的描述符。
你甚至无法知道错误是否已设定,因为
write()
是否成功。errno
的价值是什么,可以设置它的值!= 0
,即open()
和{{1} }。此write()
很可能是错误的,它会是Message[BUF_LEN-1] = '\0';
;
这似乎合乎逻辑
Message[i - 1] = '\0'
由@ zwol评论,您无法从内核空间使用memcpy(Message, buffer, length);
Message[length] = '\0';
或open()
。
答案 1 :(得分:0)
int = bytes_written;
至少要int bytes_written;
来修复您当前的错误。可能还有其他人。