普通檔案一樣透過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
#defineS_IRWXUGO(S_IRWXU|S_IRWXG|S_IRWXO)
#defineS_IALLUGO(S_ISUID|S_ISGID|S_ISVTX|S_IRWXUGO)
#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);
在ipv6中的鄰居發現協議中已經不在採用這種方式,在proc/net目錄下沒有了型別的ipv6鄰居發現的相關檔案
普通檔案一樣透過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鄰居發現的相關檔案