iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >Linux的proc怎么使用
  • 867
分享到

Linux的proc怎么使用

2023-06-16 15:06:32 867人浏览 泡泡鱼
摘要

本篇内容介绍了“linux的proc怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、简介在内核中使用printk可以讲调试信息保存

本篇内容介绍了“linux的proc怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1、简介

在内核中使用printk可以讲调试信息保存在log_buf缓冲区中,可以使用命令 #cat /proc/kmsg  将缓冲区的数区的数数据打印出来,自己写kmsg这个文件,我们取名叫做 mymsg。

2、查看内核中 /proc/kmsg怎么写的!

在Proc_misc.c (fs\proc) 文件中:

void __init proc_misc_init(void){     .........................         struct proc_dir_entry *entry;         //这里创建了一个proc入口kmsg         entry = create_proc_entry("kmsg", S_IRUSR, &proc_root);         if (entry)   entry->proc_fops = &proc_kmsg_operations;......................... }

在Kmsg.c (fs\proc) 文件中:

const struct file_operations proc_kmsg_operations = {     .read        = kmsg_read,     .poll        = kmsg_poll,     .open        = kmsg_open,     .release    = kmsg_release,};

在用户空间中使用 cat  /proc/kmsg的时候,会调用kmsg_open,在调用kmsg_read函数,读取log_buf中的数据,拷贝到用户空间显示。

3、在写之前,我们需要来学习一下循环队列

环形队列是在实际编程极为有用的数据结构,它有如下特点:

  • 它是一个首尾相连的FIFO的数据结构,采用数组的线性空间,数据组织简单,能很快知道队列是否满为空。能以很快速度的来存取数据。

  • 因为有简单高效的原因,甚至在硬件都实现了环形队列。

  • 环形队列广泛用于网络数据收发,和不同程序间数据交换(比如内核与应用程序大量交换数据,从硬件接收大量数据)均使用了环形队列。

3.1.环形队列实现原理

内存上没有环形的结构,因此环形队列实上是数组的线性空间来实现。那当数据到了尾部如何处理呢?它将转回到0位置来处理。这个的转回是通过取模操作来执行的。

因此环列队列的是逻辑上将数组元素q[0]与q[MAXN-1]连接,形成一个存放队列的环形空间。

为了方便读写,还要用数组下标来指明队列的读写位置。head/tail.其中head指向可以读的位置,tail指向可以写的位置。

Linux的proc怎么使用

环形队列的关键是判断队列为空,还是为满。当tail追上head时,队列为满时,当head追上tail时,队列为空。但如何知道谁追上谁。还需要一些辅助的手段来判断.

如何判断环形队列为空,为满有两种判断方法。

(1)是附加一个标志位tag

当head赶上tail,队列空,则令tag=0,

当tail赶上head,队列满,则令tag=1,

(2)限制tail赶上head,即队尾结点与队首结点之间至少留有一个元素的空间。

队列空: head==tail

队列满: (tail+1)% MAXN ==head

Linux的proc怎么使用

4、程序编写

#include <linux/module.h> #include<linux/kernel.h> #include<linux/fs.h> #include<linux/init.h> #include<linux/delay.h> #include<asm/uaccess.h> #include<asm/irq.h> #include<asm/io.h> #include<asm/arch/regs-gpio.h> #include<asm/hardware.h> #include<linux/proc_fs.h>  #define MYLOG_BUF_LEN 1024 static char mylog_buf[MYLOG_BUF_LEN]; static char tmp_buf[MYLOG_BUF_LEN]; static int mylog_r = 0; static int mylog_w = 0; static int mylog_r_tmp = 0;   static DECLARE_WAIT_QUEUE_HEAD(mymsg_waitq);   static int is_mylog_empty(void) {    return (mylog_r == mylog_w); }   static int is_mylog_full(void) {    return((mylog_w + 1)% MYLOG_BUF_LEN == mylog_r); }   static int is_mylog_empty_for_read(void) {    return (mylog_r_tmp == mylog_w); }   static void mylog_putc(char c) {     if(is_mylog_full())     {                 mylog_r= (mylog_r + 1) % MYLOG_BUF_LEN;                          if((mylog_r_tmp + 1)% MYLOG_BUF_LEN == mylog_r)             mylog_r_tmp= mylog_r;              }     mylog_buf[mylog_w]= c;         mylog_w= (mylog_w + 1) % MYLOG_BUF_LEN;             wake_up_interruptible(&mymsg_waitq);   }   static int mylog_getc(char *p) {         if (is_mylog_empty_for_read())     {        return 0;     }    *p = mylog_buf[mylog_r_tmp ];     mylog_r_tmp = (mylog_r_tmp  + 1) % MYLOG_BUF_LEN;    return 1; }   int myprintk(const char *fmt, ...) {     va_list args;    int i;    int j;      va_start(args, fmt);     i= vsnprintf(tmp_buf, INT_MAX, fmt, args);     va_end(args);         for (j = 0; j < i; j++)         mylog_putc(tmp_buf[j]);             return i; }   static ssize_t mymsg_read(struct file *file, char __user *buf,             size_t count, loff_t*ppos) {    int error=0;     size_t i=0;    char c;               if ((file->f_flags & O_NONBLOCK) && is_mylog_empty())        return -EAGAIN;              error= wait_event_interruptible(mymsg_waitq, !is_mylog_empty_for_read());              while (!error && (mylog_getc(&c)) && i < count) {         error= __put_user(c, buf);         buf++;         i++;     }    if (!error)         error= i;         return error; }  static int mymsg_open(struct inode * inode, struct file * file) {     mylog_r_tmp= mylog_r;    return 0; }   const struct file_operations proc_mymsg_operations = {     .read= mymsg_read,     .open= mymsg_open,     }; static int mymsg_init(void) {    struct proc_dir_entry *myentry; kmsg     myentry= create_proc_entry("mymsg", S_IRUSR, &proc_root);    if (myentry)         myentry->proc_fops = &proc_mymsg_operations;    return 0; }  static void mymsg_exit(void) {     remove_proc_entry("mymsg", &proc_root); }  module_init(mymsg_init); module_exit(mymsg_exit);   EXPORT_SYMBOL(myprintk);  MODULE_LICENSE("GPL");

5、测试程序

注意:在上面程序中 使用了 EXPORT_SYMBOL(myprintk);意思是把myprintk可以在整个内核空间使用。

使用方法:

①extern int myprintk(const char *fmt, ...);声明

② myprintk("first_drv_open : %d\n", ++cnt);使用

#include <linux/module.h> #include<linux/kernel.h> #include<linux/fs.h> #include<linux/init.h> #include<linux/delay.h> #include<asm/uaccess.h> #include<asm/irq.h> #include<asm/io.h> #include<asm/arch/regs-gpio.h> #include<asm/hardware.h>  static struct class *firstdrv_class; static struct class_device    *firstdrv_class_dev;  volatile unsigned long *gpfcon = NULL; volatile unsigned long *gpfdat = NULL;  extern int myprintk(const char *fmt, ...);  static int first_drv_open(struct inode *inode, struct file *file) {    static int cnt = 0;     myprintk("first_drv_open : %d\n", ++cnt);         *gpfcon &= ~((0x3<<(4*2)) | (0x3<<(5*2)) | (0x3<<(6*2)));    *gpfcon |= ((0x1<<(4*2)) | (0x1<<(5*2)) | (0x1<<(6*2)));    return 0; }  static ssize_t first_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos) {    int val;    static int cnt = 0;      myprintk("first_drv_write : %d\n", ++cnt);      copy_from_user(&val, buf, count); //    copy_to_user();      if (val == 1)     {        // 点灯         *gpfdat &= ~((1<<4) | (1<<5) | (1<<6));     }    else     {        // 灭灯         *gpfdat |= (1<<4) | (1<<5) | (1<<6);     }         return 0; }  static struct file_operations first_drv_fops = {     .owner =  THIS_MODULE,         .open  =  first_drv_open,         .write   =    first_drv_write,       };   int major; static int first_drv_init(void) {     myprintk("first_drv_init\n");     major= reGISter_chrdev(0, "first_drv", &first_drv_fops); // 注册, 告诉内核      firstdrv_class= class_create(THIS_MODULE, "firstdrv");      firstdrv_class_dev= class_device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xyz");       gpfcon= (volatile unsigned long *)ioremap(0x56000050, 16);     gpfdat= gpfcon + 1;     return 0; }  static void first_drv_exit(void) {     unregister_chrdev(major,"first_drv"); // 卸载      class_device_unregister(firstdrv_class_dev);     class_destroy(firstdrv_class);     iounmap(gpfcon); }  module_init(first_drv_init); module_exit(first_drv_exit);   MODULE_LICENSE("GPL");

6、在tty中测试效果

# insmod my_msg.ko # insmod first_drv.ko # cat /proc/mymsg mymsg_open mylog_r_tmp=0 first_drv_init

“Linux的proc怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Linux的proc怎么使用

本文链接: https://www.lsjlt.com/news/284044.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Linux的proc怎么使用
    本篇内容介绍了“Linux的proc怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、简介在内核中使用printk可以讲调试信息保存...
    99+
    2023-06-16
  • linux下proc是什么
    今天小编给大家分享一下linux下proc是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在linux中,proc是虚拟...
    99+
    2023-07-05
  • linux中proc的概念是什么
    今天小编给大家分享一下linux中proc的概念是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在linux中,proc...
    99+
    2023-06-29
  • Linux 下的 /proc 目录介绍
    Linux 下的 /proc 目录介绍 目录 Linux 下的 /proc 目录介绍1、/proc 目录包含的文件及其作用2、/proc 目录包含的子目录及其内容(1)/proc/bus(2)...
    99+
    2023-09-06
    linux 运维 服务器
  • proc sql语句中的case怎么用
    这篇文章给大家分享的是有关proc sql语句中的case怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。proc sql;    s...
    99+
    2024-04-02
  • Linux中/proc/meminfo是什么意思
    这篇文章主要为大家展示了“Linux中/proc/meminfo是什么意思”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux中/proc/meminfo是什么意思”这篇文章吧。Linux ...
    99+
    2023-06-25
  • Linux中proc目录的详细介绍
    这篇文章主要讲解了“Linux中proc目录的详细介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux中proc目录的详细介绍”吧!1.什么是proc观察LINUX F8的/etc/...
    99+
    2023-06-13
  • Fedora proc文件系统怎么恢复
    这篇文章主要讲解了“Fedora proc文件系统怎么恢复”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Fedora proc文件系统怎么恢复”吧!先介绍一些文件的基本概念, 文件实际上是一...
    99+
    2023-06-17
  • 一文学会使用Linux内核模块&proc实例统计所有进程信息
    目录实例要求解决方案archlinux 下的makefile实例要求 编写一个Linux的内核模块,其功能是遍历操作系统所有进程。该内核模块输出系统中:每个进程的名字、进程pid、进...
    99+
    2023-05-20
    Linux 内核模块 Linux &proc统计进程信息
  • Linux proc目录下子文件或子文件夹有什么作用
    这篇文章主要介绍“Linux proc目录下子文件或子文件夹有什么作用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Linux proc目录下子文件或子文件夹有什么作用”文章能帮助大家解决问题。一....
    99+
    2023-07-05
  • Linux系统下的proc目录有哪些文件
    本篇内容介绍了“Linux系统下的proc目录有哪些文件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!/proc/devices文件 这个文...
    99+
    2023-06-12
  • Linux的systemd怎么使用
    今天小编给大家分享一下Linux的systemd怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。systemd 是 L...
    99+
    2023-06-27
  • Linux的eCryptfs怎么使用
    本篇内容介绍了“Linux的eCryptfs怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!安装eCryptfs sudo&...
    99+
    2023-06-28
  • Linux的shutdown怎么使用
    这篇文章主要介绍“Linux的shutdown怎么使用”,在日常操作中,相信很多人在Linux的shutdown怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux的shutdown怎么使用”的疑...
    99+
    2023-06-27
  • linux的eof怎么使用
    这篇文章主要讲解了“linux的eof怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux的eof怎么使用”吧! l...
    99+
    2023-04-21
    linux eof
  • Linux的logrotate怎么使用
    本篇内容介绍了“Linux的logrotate怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!logrotate是个十分有用的工具,它...
    99+
    2023-06-28
  • Linux中的Jed怎么使用
    这篇文章主要介绍“Linux中的Jed怎么使用”,在日常操作中,相信很多人在Linux中的Jed怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux中的Jed怎么使用”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-15
  • 怎么优雅的使用Linux
    这篇文章主要介绍怎么优雅的使用Linux,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Linux 的精髓只在于它的命令行CLI (Command LIne) 和远程登录。我们要牢记,Linux 是作为一个服务器系统和...
    99+
    2023-06-16
  • Linux下的Taskwarrior怎么使用
    本篇内容主要讲解“Linux下的Taskwarrior怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux下的Taskwarrior怎么使用”吧!Taskwarrior 是 Ubun...
    99+
    2023-06-28
  • linux中的7za怎么使用
    7za是7-Zip命令行工具的一部分,可以用于在Linux中进行文件压缩和解压缩。以下是使用7za的一些常见命令:1. 压缩文件:`...
    99+
    2023-08-30
    linux
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作