zoukankan      html  css  js  c++  java
  • shell学习五十八天----/proc文件系统

    /proc文件系统

    前言:linux中的/proc文件系统,由一组文件夹和文件组成,挂载(mount)/proc文件夹下.

    /proc文件系统是一种虚拟文件系统,以文件系统文件夹和文件形式,提供一个指向内核数据结构的接口.这为查看和改变各种系统属性开启了方便之门.此外,还能通过一组以/proc/PID形式命名的文件夹(PID是进程的ID)查看系统汇总执行各进程的相关信息.

    通常,/proc文件夹下的文件内容都採取可读的文本形式,shell脚本也能对其进行解析.程序能够打开,读取和写入/proc文件夹下的既定文件.大多数情况下,仅仅有特权进程才干改动/proc文件夹下的文件内容.

    .proc文件系统初步

    1. /proc文件系统

    /proc文件系统是一种特殊的,由软件创建的文件系统,内核使用它向外界到处信息. /proc以下的每一个文件都绑定一个内核文件,用户读取当中的文件时,该函数动态的生成文件的”内容”.

    因为/proc文件系统已经被加入了大量的信息.因此,最好的办法是使用sysfs而不是/proc文件系统想歪导出信息.

    /proc文件不仅能够用于读数据,也能够用于写数据,只是写数据比較麻烦一些,这里仅仅描写叙述数据的使用方法.写数据的方法能够在看完读数据的过程后參考kernel源代码

    2.创建/proc文件的函数

    前面说了/proc下的文件都是在訪问实时生成文件内容的,那么为了创建/proc下的一个仅仅读的文件,我们必须实现一个函数用于在读取文件时生成数据,万幸,该函数接口设计好了,我们仅仅要依照函数接口实现自己须要的功能就能够了.函数原型例如以下:

    int (*read_proc)(char *page,char **start,off_t offset,int count,int *eof,void *data);
    參数说明:

    參数名

    说明

    page

    用来写入数据的缓冲区;也就是说从/proc文件里独到的数据都写入到page指向的缓冲区中

    start

    用于指定事迹的数据写入到page指向的内存也的详细的那个位置

    offset

    read函数中的參数意义同样

    count

    read函数中的參数意义同样

    eof

    当没有数据返回时,必须设置该參数为一个整数,比如:*eof=1;

    data

    该參数是内核提供给驱动程序的专用指针,能够用于内部记录

    *创建制度的/proc文件的函数

    struct proc_dir_entry *create_proc_read_entry(const char *name,mode_t mode, struct proc_dir_entry *base, read_proc_t *read_proc, void * data)

    參数说明:

    參数名

    说明

    name

    要创建/proc下的文件名称

    mode

    创建的文件权限的掩码,若为0,则使用系统默认的权限

    base

    该文件所在的父文件夹,若该參数为null,则该文件将会被创建在/proc的根文件夹下

    read_proc

    读取/proc下的文件时调用的函数,也就是前面解说的那个函数

    data

    内核会忽略date,但会把该參数传递给read_proc函数

    删除/proc系统文件的函数:
    void remove_proc_entry(const char *name, struct proc_dir_entry *parent)
    參数说明:

    參数名

    说明

    name

    /proc文件系统中创建的文件名称

    parent

    父文件夹名

    3.使用/proc文件系统的缺点

    (1).删除调用可能在/proc文件系统的文件正在被使用时发生

    (2)同一个文件名称可能注冊两次,这将会错误发生

    二.创建简单的/proc文件

    #cd /proc ; vi read_proc  //read_proc的内容例如以下:

    #include <linux/kernel.h>

    #include <linux/init.h>

    #include <linux/module.h>

    #include <linux/proc_fs.h>

    int read_proc(char *page,char **start,off_t offset,int count,int *eof,void *data);

    static int __init test_proc_init(void)

    {

        create_proc_read_entry("read_proc",0,NULL,read_proc,NULL);

        return 0;

    }

    static void __exit test_proc_exit(void)

    {

        remove_proc_entry("read_proc",NULL);

    }

    int read_proc(char *page,char **start,off_t offset,int count,int *eof,void *data)

    {

        int len = sprintf(page,"%s ","hello world");

        return len;

    }

    module_init(test_proc_init);

    module_exit(test_proc_exit);

    MODULE_LICENSE("GPL");

    MODULE_AUTHOR("wangxq");

    #cat /proc/read_proc

    hello world




    /proc文件夹的应用

    对此文件系统的訪问同一般文件同样。

    例:

    1.统计cpu个数:

    cat /proc/cpuinfo | grep'physical id'|uniq -c|wc l

    2.cpu型号

    cat /proc/cpuinfo|grepname|cut -f2 -d:|uniq

    3.计算每一个cpu的内核数

    cat /proc/cpuinfo | grep'physical id'|awk -F':' '{count[$2]++;}END{sum=0;for(a in count){cc++;sum+=count[a]}printsum/cc;}'

    4.内核版本号

    cat /proc/version|cut-f1 -d'('

    5.内核运行的上下文转换次数

    cat /proc/stat|grep ctxt|awk'{print $2}'

    6.系统创建的进程数

    cat /proc/stat|grep processes|awk'{print $2}'

    7.当前可用的内存数量

    cat /proc/meminfo|grep MemFree


  • 相关阅读:
    FlashInspector 【Firefox浏览器插件,flash分析工具】
    屌丝和木耳
    Flash剪贴板功能
    sql newid()随机函数
    SQL 视图
    向SQL Server 现有表中添加新列并添加描述.
    sql server 约束 查找
    创建与删除SQL约束或字段约束
    SQLServer
    利用排序规则特点计算汉字笔划和取得拼音首字母
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7241960.html
Copyright © 2011-2022 走看看