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...