Linux kernel 如何在驱动模块中使用seq_文件实现可写程序文件
在Linux设备驱动程序第三版的书中,Linux kernel 如何在驱动模块中使用seq_文件实现可写程序文件,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,在Linux设备驱动程序第三版的书中,/proc文件系统被用作输出方法,以导出特定设备驱动程序的运行状态 但是,在某些情况下,/proc文件系统用作一个接口,用于更改驱动程序模块的内部参数 我在谷歌上搜索了很多,发现互联网上的一些实现太旧了,以至于他们使用create\u proc\u entry()而不是proc\u create() 更重要的是,我更喜欢通过seq_file实现这一点(实际上,我不确定这是否可能)。我检查了seq_write()函数,但没有得到任何结果 谁能给我举个例子来完成
/proc
文件系统被用作输出方法,以导出特定设备驱动程序的运行状态
但是,在某些情况下,/proc
文件系统用作一个接口,用于更改驱动程序模块的内部参数
我在谷歌上搜索了很多,发现互联网上的一些实现太旧了,以至于他们使用create\u proc\u entry()
而不是proc\u create()
更重要的是,我更喜欢通过seq_file
实现这一点(实际上,我不确定这是否可能)。我检查了seq_write()
函数,但没有得到任何结果
谁能给我举个例子来完成这个任务
seq_文件
实现更为可取。seq_文件
仅为读取文件提供帮助。没有类似的写入帮助程序,但实现并不困难。手动写入可读取数据的回调:
与读取不同,您可以在.write回调中删除文件的位置处理,假设用户总是写入到开头,或者(可选)写入到结尾(使用O_APPEND文件的控制标志)。
其次,与读取不同,您可以假设用户一次写入1、2个或更多元素的内容,而不是半个元素
最简单的方法是允许通过单个元素进行写入:
size_t write(struct file* file, const char __user* buf, size_t size, loff_t* pos)
{
copy_from_user(str, buf, size); // Copy string from user space
my_elem = my_parse(str, size); // Parse string
if(file->f_flags & O_APPEND) {
list_add_tail(my_elem, &my_list);//Append element to the end of list
}
else {
clear_my_list(); // Clear old content of the list
list_add_tail(my_elem, &my_list);// Add single element to it.
}
(void)pos; //Do not use file position at all
return count; // Return number of bytes passed by the user
}
如果用户想写入多个元素,例如从硬盘上的文件中写入,任何shell都可以将该文件拆分,例如新行,并将行逐个馈送到您的proc文件。在我绑定了很多之后。我发现实际上没有seq
version写入函数。但是,您可以将/proc
文件视为普通设备文件,该文件可以通过文件操作
中定义的方法进行操作