如何在驱动模块中使用 seq_file 实现可写的 proc 文件
How to implement a writable proc file by using seq_file in a driver module
在Linux Device Driver 3rd ed一书中,/proc
文件系统被用作导出运行某个设备驱动程序的状态。
然而,在某些情况下,/proc
文件系统被用作一个接口来改变驱动模块的内部参数。
我google了很多,发现网上有些实现太老了,用的是create_proc_entry()
而不是proc_create()
。
而且,我更喜欢通过seq_file
来实现这个(实际上,我不确定是否可能)。我检查了 seq_write()
函数,没有得到任何结果。
谁能给我一个例子来完成这个任务? seq_file
实施更受欢迎。
seq_file
提供仅用于读取文件的助手。 write没有类似的helpers,但是自己动手实现可迭代数据的回调.write
并不难:
与读取不同,您可以在 .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
版本写入功能。但是,您可以将 /proc
文件视为普通设备文件,可以通过 file_operations
.
中定义的方法进行操作。
在Linux Device Driver 3rd ed一书中,/proc
文件系统被用作导出运行某个设备驱动程序的状态。
然而,在某些情况下,/proc
文件系统被用作一个接口来改变驱动模块的内部参数。
我google了很多,发现网上有些实现太老了,用的是create_proc_entry()
而不是proc_create()
。
而且,我更喜欢通过seq_file
来实现这个(实际上,我不确定是否可能)。我检查了 seq_write()
函数,没有得到任何结果。
谁能给我一个例子来完成这个任务? seq_file
实施更受欢迎。
seq_file
提供仅用于读取文件的助手。 write没有类似的helpers,但是自己动手实现可迭代数据的回调.write
并不难:
与读取不同,您可以在 .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
版本写入功能。但是,您可以将 /proc
文件视为普通设备文件,可以通过 file_operations
.