Maison > Article > Opération et maintenance > Pilote Linux | Création d'interface procfs
L'article précédent présentait la création de l'interface sysfs dans le pilote Linux. Aujourd'hui, nous allons présenter la création de l'interface procfs.
procfs code> : peut obtenir quelque chose comme <code style="font-size : 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background - couleur : rgba (27, 31, 35, 0,05) ; famille de polices : « Operator Mono », Consolas, Monaco, Menlo, monospace ; saut de mot : break-all ; couleur : rgb (239, 112, 96) ; ">Fonctionnement de cat /proc/cpuinfo
procfs
:可实现类似cat /proc/cpuinfo
的操作
实现效果:
例如, 在/proc
下创建一个clk节点,通过cat /proc/clk
Système | |
---|---|
Linux |
Ajoutez le code suivant dans le pilote :
#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");
La création de l'interface procfs implémente principalement struct file_operations
structure, puis transmettez proc_create
fonction pour s'enregistrer, via proc_remove
fonction pour se déconnecter. 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
, nous n'avons donc besoin que d'implémenter la fonction membre .open. Lors de l'utilisation de cat code>Vue de commande<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);famille de polices : " operator mono consolas monaco menlo monospace de mot break-all rgb>/ proc
, appellera .open
fonction d'implémentation correspondante. 🎜🎜Ici, nous utilisons seq_file
, ce qu'il faut retenir c'est que procfs est généralement utilisé avec l'interface seq_file. seq_file est une interface de fichier de séquence. Lorsque le contenu des données proc que nous créons est composé d'une série de séquences de données ou s'il s'agit d'un système de fichiers proc relativement volumineux, il est recommandé d'utiliser l'interface seq_file, telle que cat /proc/meminfo
Beaucoup de contenu sera affiché. 🎜L'interface seq_file résout principalement les problèmes existant dans la programmation de l'interface proc. Il est recommandé d'utiliser l'interface seq_file lors de la programmation de l'interface proc De plus, les fonctions membres .read, .llseek et .release peuvent également être utilisées directement. seq_read
, seq_lseek
et seq_release code>. <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
Système | Version du noyau |
---|---|
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
,但本质还是一样的,只是换了名字,更加规范了一些。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!