如何在驱动程序模块中使用seq_file实现可写proc文件

时间:2015-06-08 13:32:24

标签: linux-kernel linux-device-driver

Linux Device Driver 3rd ed 一书中,/proc文件系统用作输出方法以导出某个设备驱动程序的运行状态。

但是,在某些情况下,/proc文件系统用作一个接口来更改驱动程序模块的内部参数。

我搜索了很多内容,发现互联网上的某些实现太旧了,以至于他们使用create_proc_entry()而不是proc_create()

更重要的是,我更愿意通过seq_file来实现这一点(实际上,我不确定是否可能)。我检查了seq_write()函数,什么也没得到。

有人能告诉我一个完成这项任务的例子吗? seq_file实施更为可取。

2 个答案:

答案 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中定义的方法进行操作。