如何在驱动模块中使用 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.

中定义的方法进行操作。