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

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

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

我google了很多,发现互联网上的一些实现太旧了,他们使用create_proc_entry()而不是proc_create().

更重要的是,我更喜欢通过seq_file实现它(实际上,我不确定是否可能).我检查了seq_write()函数,什么也没得到.

谁能告诉我一个完成这项任务的例子? seq_file实现是更优选的.

解决方法

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文件.

相关文章

/etc/sysctl.conf这个目录主要是配置一些系统信息,/etc/sys...
1.作用 useradd或adduser命令用来建立用户帐号和创建用户的起...
它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅...
不管是我们在安装软件还是监测软件的使用性能,我们都要随时...
装好Tomcat7后,发现除了本机能访问外界访问不了,岂有此理。...
修改防火墙配置需要修改 /etc/sysconfig/iptables 这个文件,...