回覆列表
  • 1 # 永遠的一直寂寞

    普通檔案一樣透過cat和more命令檢視其中的內容。

    大多數的網路功能在其初始化時都會在/proc中註冊一個或多個檔案,不是在引導時就是在模組載入時,網路程式碼註冊的檔案位於/proc/net目錄下

    /proc中的目錄尅是用proc_mkdir建立,如果在終端下,在proc目錄下,使用mkdir命令建立目錄,不會成功

    root@zfz:/proc/net#mkdirbb

    mkdir:cannotcreatedirectory`bb":Nosuchfileordirectory

    /proc/net中的檔案可以使用定義的include/linux/proc_fs.h中的proc_net_fops_create和proc_net_remove進行註冊和解除安裝,在這兩個函數里面含有更通用的函式create_proc_entry和remove_proc_entry,注意,proc_net_fops_create負責建立文件,然後,初始化器檔案操作函式。下面有一個例子:在Linux作業系統下的proc/net目錄下有一個arp的檔案

    透過cat命令可以檢視,記錄著鄰居表項的相關資訊,該檔案就是透過proc進行註冊的。

    catarp

    IPaddressHWtypeFlagsHWaddressMaskDevice

    1.1.2.10x10x200:01:10:10:10:10*eth0

    1.1.2.30x10x2bc:10:10:10:10:10*eth0

    下面看一個的ARP協議中是如何在/proc/net中註冊arp檔案的。

    staticstructfile_operationsarp_seq_fops={

    .owner=THIS_MODULE,

    .open=arp_seq_open,

    .read=seq_read,

    .llseek=seq_lseek,

    .release=seq_release_private,

    };

    staticint__initarp_proc_init(void)

    {

    if(!proc_net_fops_create("arp",S_IRUGO,&arp_seq_fops))

    return-ENOMEM;

    return0;

    }

    有proc_net_fops_create函式的三個輸入引數可以看出,檔名為arp,許可權必須指定為只讀。

    #defineS_IRUGO(S_IRUSR|S_IRGRP|S_IROTH)

    定義了檔案的許可權,

    檔案許可權值。定義在src/include/stat.h中。

    這裡的S_IRUGO=(S_IRUSR|S_IRGRP|S_IROTH)

    S_IRUSR:使用者讀00400

    S_IRGRP:使用者組讀00040

    S_IROTH:其他讀00004

    而且該組檔案操作處理例程是arp_seq_ops。當一個使用者讀取該檔案時,使用file_operations資料結構,允許procfs返回資料給使用者,當資料由一群形同型別的物件組成時會很有用,例如:ARP快取在返回是一次只返回以項(entry),路由表在返回時一次只返回一條路徑。

    #ifndef_LINUX_STAT_H

    #define_LINUX_STAT_H

    #ifdef__KERNEL__

    #include<asm/stat.h>

    #endif

    #ifdefined(__KERNEL__)||!defined(__GLIBC__)||(__GLIBC__<2)

    #defineS_IFMT00170000

    #defineS_IFSOCK0140000

    #defineS_IFLNK0120000

    #defineS_IFREG0100000

    #defineS_IFBLK0060000

    #defineS_IFDIR0040000

    #defineS_IFCHR0020000

    #defineS_IFIFO0010000

    #defineS_ISUID0004000

    #defineS_ISGID0002000

    #defineS_ISVTX0001000

    #defineS_ISLNK(m)(((m)&S_IFMT)==S_IFLNK)

    #defineS_ISREG(m)(((m)&S_IFMT)==S_IFREG)

    #defineS_ISDIR(m)(((m)&S_IFMT)==S_IFDIR)

    #defineS_ISCHR(m)(((m)&S_IFMT)==S_IFCHR)

    #defineS_ISBLK(m)(((m)&S_IFMT)==S_IFBLK)

    #defineS_ISFIFO(m)(((m)&S_IFMT)==S_IFIFO)

    #defineS_ISSOCK(m)(((m)&S_IFMT)==S_IFSOCK)

    #defineS_IRWXU00700

    #defineS_IRUSR00400

    #defineS_IWUSR00200

    #defineS_IXUSR00100

    #defineS_IRWXG00070

    #defineS_IRGRP00040

    #defineS_IWGRP00020

    #defineS_IXGRP00010

    #defineS_IRWXO00007

    #defineS_IROTH00004

    #defineS_IWOTH00002

    #defineS_IXOTH00001

    #endif

    #ifdef__KERNEL__

    #defineS_IRWXUGO(S_IRWXU|S_IRWXG|S_IRWXO)

    #defineS_IALLUGO(S_ISUID|S_ISGID|S_ISVTX|S_IRWXUGO)

    #defineS_IRUGO(S_IRUSR|S_IRGRP|S_IROTH)

    #defineS_IWUGO(S_IWUSR|S_IWGRP|S_IWOTH)

    #defineS_IXUGO(S_IXUSR|S_IXGRP|S_IXOTH)

    #include<linux/types.h>

    #include<linux/time.h>

    structkstat{

    unsignedlongino;

    dev_tdev;

    umode_tmode;

    unsignedintnlink;

    uid_tuid;

    gid_tgid;

    dev_trdev;

    loff_tsize;

    structtimespecatime;

    structtimespecmtime;

    structtimespecctime;

    unsignedlongblksize;

    unsignedlongblocks;

    };

    在進行open操作是,會做另一個重要的初始化,註冊一個函式指標陣列,包括procfs用於遍歷要傳回給使用者資料的所有例程:一個例程啟動解除安裝,另一個載入,

    staticstructseq_operationsarp_seq_ops={

    .start=arp_seq_start,

    .next=neigh_seq_next,

    .stop=neigh_seq_stop,

    .show=arp_seq_show,

    };

    staticintarp_seq_open(structinode*inode,structfile*file)

    {

    structseq_file*seq;

    intrc=-ENOMEM;

    structneigh_seq_state*s=kmalloc(sizeof(*s),GFP_KERNEL);

    if(!s)

    gotoout;

    memset(s,0,sizeof(*s));

    rc=seq_open(file,&arp_seq_ops);

    if(rc)

    gotoout_kfree;

    seq=file->private_data;

    seq->private=s;

    out:

    returnrc;

    out_kfree:

    kfree(s);

    gotoout;

    }

    在ipv6中的鄰居發現協議中已經不在採用這種方式,在proc/net目錄下沒有了型別的ipv6鄰居發現的相關檔案

  • 中秋節和大豐收的關聯?
  • 求《孫權勸學》的擴寫?