Artikel sebelumnya memperkenalkan penciptaan antara muka sysfs dalam pemacu Linux Hari ini kami akan memperkenalkan penciptaan antara muka procfs.
procfs code>: Boleh mencapai sesuatu seperti <code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background - warna: rgba(27, 31, 35, 0.05);font-family: " operator mono consolas monaco menlo monospace break-all rgb>Operasi kucing /proc/cpuinfo
procfs
:可实现类似cat /proc/cpuinfo
的操作
实现效果:
例如, 在/proc
下创建一个clk节点,通过cat /proc/clk
System version | |
---|---|
Pelaksanaan kod: |
Tambah kod berikut dalam pemacu:
#include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/proc_fs.h> #include <linux/seq_file.h> struct proc_dir_entry *my_proc_entry; static int proc_clk_show(struct seq_file *m, void *v) { //cat显示的内容 seq_printf(m, "pll0: %u Mhz\n" "pll1: %u Mhz\n" "pll2: %u Mhz\n", 100, 200, 300); return 0; } static int clk_info_open(struct inode *inode, struct file *filp) { return single_open(filp, proc_clk_show, NULL); } static struct file_operations myops = { .owner = THIS_MODULE, .open = clk_info_open, .read = seq_read, .llseek = seq_lseek, .release = seq_release, }; static int __init my_module_init(void) { //注册proc接口 my_proc_entry = proc_create("clk", 0644, NULL, &myops); return 0; } static void __exit my_module_exit(void) { //注销proc接口 proc_remove(my_proc_entry); } module_init(my_module_init); module_exit(my_module_exit); MODULE_LICENSE("GPL");
Penciptaan antara muka procfs terutamanya melaksanakan struct file_operations
struktur, dan kemudian lulus proc_create
fungsi untuk mendaftar, melalui proc_remove
berfungsi untuk log keluar. struct file_operations
结构体,然后通过proc_create
函数进行注册,通过proc_remove
函数进行注销。
procfs通常是用来获取CPU、内存、进程等各种信息,例如cat /proc/cpuinfo
、cat /proc/meminfo
,所以我们只需要实现.open成员函数。当使用cat
命令查看/proc
下的信息时,会调用到.open
对应的实现函数。
这里我们使用了seq_file
接口,需要记住的是,procfs通常会和seq_file接口一起使用。seq_file是一个序列文件接口,当我们创建的proc数据内容由一系列数据顺序组合而成或者是比较大的proc文件系统时,都建议使用seq_file接口,例如cat /proc/meminfo
cat /proc/cpuinfo
, cat /proc/meminfo
, jadi kita hanya perlu melaksanakan fungsi ahli .open. Apabila menggunakan cat</ kod>Paparan arahan<code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">/ proc
, akan memanggil .open
fungsi pelaksanaan yang sepadan. 🎜🎜Di sini kami menggunakan antara muka seq_file
, apa yang perlu diingat ialah procfs biasanya digunakan bersama antara muka seq_file. seq_file ialah antara muka fail jujukan Apabila kandungan data proc yang kami cipta terdiri daripada satu siri jujukan data atau ia adalah sistem fail proc yang agak besar, adalah disyorkan untuk menggunakan antara muka seq_file, seperti cat /proc/meminfo
Banyak kandungan akan dipaparkan. 🎜Antara muka seq_file terutamanya menyelesaikan masalah yang ada dalam pengaturcaraan antara muka proc Adalah disyorkan untuk menggunakan antara muka seq_file apabila memprogramkan antara muka proc Selain itu, fungsi ahli .read, .llseek, dan .release juga boleh digunakan secara langsung seq_read
, seq_lseek</code; > dan <code style="font-size : 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba( 27, 31, 35, 0.05);font -family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">seq_release</ kod>. <code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">seq_read
、seq_lseek
和seq_release
。
注意,在较新版本的内核中,procfs
System | Versi kernel |
---|---|
Linux | 5.10.111 |
在驱动中添加以下代码:
#include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/proc_fs.h> #include <linux/seq_file.h> struct proc_dir_entry *my_proc_entry; static int proc_clk_show(struct seq_file *m, void *v) { seq_printf(m, "pll0: %lu Mhz\n" "pll1: %lu Mhz\n" "pll2: %lu Mhz\n", 100, 200, 300); return 0; } static int clk_info_open(struct inode *inode, struct file *filp) { return single_open(filp, proc_clk_show, NULL); } static const struct proc_ops clk_stat_proc_fops = { .proc_open = clk_info_open, .proc_read = seq_read, .proc_lseek = seq_lseek, .proc_release = seq_release, }; static int __init my_module_init(void) { my_proc_entry = proc_create("clk", 0, NULL, &clk_stat_proc_fops); return 0; } static void __exit my_module_exit(void) { proc_remove(my_proc_entry); } module_init(my_module_init); module_exit(my_module_exit); MODULE_LICENSE("GPL");
新的proc
接口中,将原来的struct file_operations
换成了struct proc_ops
,其中成员函数也添加了对应的前缀proc
,但本质还是一样的,只是换了名字,更加规范了一些。
Atas ialah kandungan terperinci Pemacu Linux |. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!