proc文件系統介紹


(1)linux內核是一個非常龐大、非常復雜的一個單獨的程序,對於這樣的一個程序來說調試是非常復雜的。
(2)項kernel這樣龐大的項目,給里面添加/更改一個功能是非常麻煩的,因為你這添加的一個功能可能會影響其他已經有的。
(3)早期內核版本中盡管調試很麻煩,但是高手們還可以憑借個人超凡脫俗的能力去駕馭。但是到了2.4左右的版本的時候,這個難度已經非常大了。
(4)為了降低內核調試和學習的難度,內核開發者們在內核中添加了一些屬性專門用於調試內核,proc文件系統就是一個嘗試。
(5)proc文件系統的思路是:在內核中構建一個虛擬文件系統/proc,內核運行時將內核中一些關鍵的數據結構以文件的方式呈現在/proc目錄中的一些特定文件中,這樣相當於將不可見的內核中的數據結構以可視化的方式呈現給內核的開發者。
(6)proc文件系統給了開發者一種調試內核的方法:我們通過實時的觀察/proc/xxx文件,來觀看內核中特定數據結構的值。在我們添加一個新功能的前后來對比,就可以知道這個新功能產生的影響對還是不對。
(7)proc目錄下的文件大小都是0,因為這些文件本身並不存在於硬盤中,他也不是一個真實文件,他只是一個接口,當我們去讀取這個文件時,其實內核並不是去硬盤上找這個文件,而是映射為內核內部一個數據結構被讀取並且格式化成字符串返回給我們。所以盡管我們看到的還是一個文件內容字符串,和普通文件一樣的;但是實際上我們知道這個內容是實時的從內核中數據結構來的,而不是硬盤中來的。

1、常用proc中的文件介紹

(1)/proc/cmdline
(2)/proc/cpuinfo
(3)/proc/devices
(4)/proc/interrupts

2、proc文件系統的使用

cat以手工查看
程序中可以文件IO訪問
在shell程序中用cat命令結合正則表達式來獲取並處理內核信息

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc ,char **argv)
{
    int fd=-1;
    char buf[500]={0};
    if(argc!=2)
    {
        printf("eg: %s -d|-v\n",argv[0]);
        return -1;
    }
    if(!strcmp(argv[1],"-v"))
    {
        fd=open("/proc/version",O_RDONLY);
        read(fd,buf,sizeof(buf));
        printf("結果:\n%s\n",buf);
    }
    else if(!strcmp(argv[1],"-d"))
    {
        fd=open("/proc/devices",O_RDONLY);
        read(fd,buf,sizeof(buf));
        printf("結果:\n%s\n",buf);
    }
}

3、擴展:sys文件系統

(1)sys文件系統本質上和proc文件系統是一樣的,都是虛擬文件系統,都在根目錄下有個目錄(一個是/proc目錄,另一個是/sys目錄),因此都不是硬盤中的文件,都是內核中的數據結構的可視化接口。
(2)不同的是/proc中的文件只能讀,但是/sys中的文件可以讀寫。讀/sys中的文件就是獲取內核中數據結構的值,而寫入/sys中的文件就是設置內核中的數據結構的元素的值。
(3)歷史上剛開始先有/proc文件系統,人們希望通過這種技術來調試內核。實際做出來后確實很有用,所以很多內核開發者都去內核調價代碼向/proc目錄中寫文件,而且剛開始的時候內核管理者對proc目錄的使用也沒有什么經驗也沒什么統一規划,后來的結果就是proc里面的東西又多又雜亂。
(4)后來覺得proc中的內容太多太亂缺乏統一規划,於是乎又添加了sys目錄。sys文件系統一開始就做了很好的規划和約定,所以后來使用sys目錄時有了規矩。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM