在 Linux Device Driver 3rd ed 一书中,/proc
文件系统用作输出方法以导出某个设备驱动程序的运行状态。
但是,在某些情况下,/proc
文件系统用作一个接口来更改驱动程序模块的内部参数。
我搜索了很多内容,发现互联网上的某些实现太旧了,以至于他们使用create_proc_entry()
而不是proc_create()
。
更重要的是,我更愿意通过seq_file
来实现这一点(实际上,我不确定是否可能)。我检查了seq_write()
函数,什么也没得到。
有人能告诉我一个完成这项任务的例子吗? seq_file
实施更为可取。
答案 0 :(得分:4)
seq_file
仅为读取文件提供帮助程序。写入没有类似的帮助程序,但手动实现.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文件。
答案 1 :(得分:2)
我绑了很多。我发现实际上没有seq
版本的写入功能。但是,您可以将/proc
文件视为普通设备文件,该文件可以通过file_operations
中定义的方法进行操作。