proc 虛擬檔案系統 例項

2021-08-15 21:59:51 字數 2990 閱讀 7637

linux下有乙個神奇的目錄/proc,經常會執行 cat /proc/cpuinfo 命令檢視cpu資訊,/proc下的確有cpuinfo檔案,但是這個檔案不是物理存在的,是軟體虛擬出來的,與普通檔案不同,該檔案是動態的。通過/proc可以實現使用者態與核心態之間的通訊。在核心模式下,可以很方便的建立/proc子目錄,並進行讀寫操作,只不過此時你需要實現檔案讀寫介面,因為核心不知道如何處理該檔案。

下面建立/proc/test目錄,並新建log檔案,進行讀寫操作。

一.系統api

extern struct proc_dir_entry proc_mkdir(const char *dir_name,struct proc_dir_entry *parent);

新建/proc子目錄,如parent為null,則在/proc根下建立目錄

extern struct proc_dir_entry proc_create_entry(const char *name,mode_t mode,struct proc_dir_entry *parent);

在/proc下新建虛擬檔案

extern void *remove_proc_entry(const char *name,struct proc_dir_entry *parent);

刪除新建的檔案或目錄 

二.編碼

c**  

#ifndef __kernel__

#define __kernel__

#endif  /* __kernel__ */

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#define max_cookie_length page_size

static

struct proc_dir_entry *test_proc_dir;  

static

struct proc_dir_entry *log_proc_dir;  

static

char *cookie_pot;     // 核心緩衝區,用於寫資料

static

int tvalue = 12;      // 顯示值

// 讀取日誌檔案函式

int proclogread( char *buffer,  

char **start,  

off_t offset,  

int length,  

int *eof,  

void *data )  

len = sprintf(buffer, "number:%x\n",tvalue);  

return len;  

}  // 寫日誌檔案函式

int proclogwrite( struct file *filp,  

const

char __user *buff,  

unsigned long len,  

void *data)  

sscanf(cookie_pot,"%d",&tvalue);    // 儲存至全域性變數tvalue

printk(kern_alert "%s len:%lu vl:%d\n",cookie_pot,len,tvalue);  

return len;  

}  static

int __init testproc_init(void)  

else

else

}  return 0;  

}  static

void __exit testproc_exit(void)  

module_init(testproc_init);  

module_exit(testproc_exit);  

module_license("dual bsd/gpl");  

module_author("kettas");  

module_description("proc test");  

module_version("1.0.0");  

module_alias("proc 01");  

三.編譯執行

shell**  

[scada@linux proc_test]$ sudo insmod proc_test.ko  

[scada@linux proc_test]$ ll /proc/net/test/  

總用量 0

-rw-r--r--. 1 root root 0

1月  11

22:14 log  

[scada@linux proc_test]$ cat /proc/net/test/log   

number:c  

四.介面操作

上面用cat命令直接檢視log檔案,既然核心提供了通用的read(),write()檔案訪問介面,那試試。

c**  

#include 

#include 

#include 

#include 

#include 

#include 

#include 

int main(int argc,char **argv)  

;  ret = read(fd,buff,100);  

assert(ret != -1);  

printf("read:%s\n",buff);  

close(fd);  

return 0;  

}  執行:

shell**  

[scada@linux proc_test]$ sudo ./write_test  

ret:2

read:number:a  

向/proc/net/test/log寫入10後,顯示了16進製制結果a,測試ok

虛擬檔案系統proc

proc 檔案系統是 gnu linux 特有的。它是乙個虛擬的檔案系統,因此在該目錄中的所有檔案都不會消耗磁碟空間。通過它能夠非常簡便地了解系統資訊,尤其是其中的大部分檔案是人類可閱讀的 不過還是需要一些幫助 許多程式實際上只是從 proc 的檔案中收集資訊,然後按照它們自己的格式組織後顯示出來。...

虛擬檔案系統

虛擬檔案系統 virtual file system,簡稱 vfs 是 linux 核心中的乙個軟體層,用於給使用者空間的程式提供檔案系統介面 同時,它也提供了核心中的乙個 抽象功能,允許不同的檔案系統共存。系統中所有的檔案系統不但依賴 vfs 共存,而且也依靠 vfs 協同工作。為了能夠支援各種實...

EXT2檔案系統 虛擬檔案系統 proc檔案系統

1 只看該作者 倒序看帖 列印 1 引言 很詳細地了解某個作業系統的實際工作方式是非常困難的,因為大多數作業系統的源 都是嚴格保密的。在以實際使用為目標的作業系統中,讓任何人都可以自由獲取系統源 無論目的是要了解 學習還是修改,這樣的系統並不多。本 的主題就是這些少數作業系統中的乙個 linux。l...