這段時間在做linux c嵌入式項目時遇到在linux內核讀寫文件的問題。衆所周知,在內核態,不可以使用譬如用戶態下的fopen等函數。這裏介紹兩種方法:
1.普通文件
例如tmp目錄下demo文件,即tmp/demo
利用struct file* filp_open(const char* filename, int open_mode, int mode);
參數說明
filename: 表明要打開或創建文件的名稱(包括路徑部分)。在內核中打開的文件時需要注意打開的時機,很容易出現需要打開文件的驅動很早就加載並打開文件,但需要打開的文件所在設備還沒有掛載到文件系統中,而導致打開失敗。
open_mode: 文件的打開方式,其取值與標準庫中的open相應參數類似,可以取O_CREAT,O_RDWR,O_RDONLY等。
mode: 創建文件時使用,設置創建文件的讀寫權限,其它情況可以匆略設爲0。
static void read_file( void )
{
// 打開文件
struct file* fp = filp_open("/etc/redis/test.conf",O_RDWR,0);
if(!fp || IS_ERR(fp))
{
printk(KERN_ALERT "fail to open test.conf\n");
return -1;
}
filp_close( fp,NULL);
}
2.在proc目錄下讀寫文件(推薦使用)
Linux系統上的/proc目錄是一種文件系統,即proc文件系統。與其它常見的文件系統不同的是,/proc是一種僞文件系統(也即虛擬文件系統),存儲的是當前內核運行狀態的一系列特殊文件,用戶可以通過這些文件查看有關係統硬件及當前正在運行進程的信息,甚至可以通過更改其中某些文件來改變內核的運行狀態。
用戶也可以在proc虛擬文件系統也創建節點,實現用戶空間與內核空間的交互。
創建proc節點
struct proc_dir_entry *create_proc_entry (const char *name, mode_t mode, struct proc_dir_entry *parent);
參數:
name:/proc/下節點的文件名,也可以是路徑;例:“driver/demo”,在driver下創建demo節點
mode:訪問權限,與普通文件相同;例:0666可讀可寫,0444只讀,0222只寫
parent:父目錄,可以爲 NULL(表示 /proc 根目錄);
例如:create_proc_entry("deviceInfo",0666,NULL); //在proc文件系統建立deviceInfo文件
文件操作
static int deviceInfo_read_proc(char *page, char **start, off_t off,
int count, int *eof, void *data) //將信息寫入proc文件
static int deviceInfo_write_proc(struct file *file, const char *buffer,
unsigned long count, void *data)//從proc文件中獲取信息
static void read_file( void )
{
struct proc_dir_entry *entry;
entry= create_proc_entry("deviceInfo",0666,NULL);
if(entry)
{
entry->read_proc = deviceInfo_read_proc;
entry->write_proc = deviceInfo_write_proc;
}
}
綜上所述,採用proc文件更加安全以及快捷