2011年12月13日 星期二

Linux kernel內讀寫檔案

在driver裡面,我們有時需要留一些資訊在磁碟上讓userspace作溝通,因此需要從kernel上直接寫入檔案。

相關API程式碼如下:

void InitKernelEnv(void){ 
oldfs = get_fs();
set_fs(KERNEL_DS);
}

void DinitKernelEnv(){
set_fs(oldfs);
}

struct file *OpenFile(char *path,int flag,int mode){
struct file *fp;

fp=filp_open(path, flag, 0);
if (fp) return fp;
else return NULL;
}

int WriteFile(struct file *fp,char *buf,int readlen) {
if (fp->f_op && fp->f_op->read)
return fp->f_op->write(fp,buf,readlen, &fp->f_pos);
else
return -1;
}

int ReadFile(struct file *fp,char *buf,int readlen)
{
if (fp->f_op && fp->f_op->read)
return fp->f_op->read(fp,buf,readlen, &fp->f_pos);
else
return -1;
}

int CloseFile(struct file *fp) {
filp_close(fp,NULL);
return 0;
}

而使用方法請參考下面這個範例:

void test(){
char read_buf[2048] = "";
char write_buf[2048] = "";
struct file *fp;

InitKernelEnv();

//read file
fp = OpenFile(WPS_STA_LIST_FILE, O_RDONLY | O_CREAT, 0);
if(fp != NULL){
ReadFile(fp, read_buf, sizeof(read_buf));
}

CloseFile(fp);


//write to file
fp = OpenFile(WPS_STA_LIST_FILE, O_CREAT | O_WRONLY, 0);
if (fp!= NULL) {
WriteFile(fp, write_buf, sizeof(write_buf));
}

CloseFile(fp);

DinitKernelEnv();

}

參考資料:
[1] 請問內核中讀寫配置文件的源碼在哪個目錄的哪個文件中
[2] Reading file in kernel-簡單但實用

Linux kernel內取得時間

在kernel裡面,沒有辦法使用time(0)取得時間,但是我們可以利用do_gettimeofday()方式將時間取出。

//預先引入標頭檔
#include <linux/time.h>

...

//取得時間
struct timeval tv1;
do_gettimeofday(&tv1);

經由tv內部的tv_sec就可以取得目前系統時間的秒數了。


參考資料:
[1] linux kernel时间
[2] 时间处理函数 | do_gettimeofday() -- 获取当前系统时间

2011年12月11日 星期日

小笨霖的英文筆記

有一陣子剛好逛到小笨霖的英文筆記。

裡面依據主題條列了許多道地的英文口語說法。對於常接觸電影或是影集的人,會感到不陌生才是。

我花了點時間全部看完,真得是很推薦!

網址:http://som.twbbs.org/klee/notebook/index.html

2011年12月9日 星期五

Free

我的心終於自由了。

很感謝這次出國的機會,讓我見識到更多。我發現我的喜歡是很膚淺的。只要女生有打扮化妝,型又是我喜歡的那種,我就會有喜歡的感覺了。

因此,我已經放棄以前的想法了。

把該塵封的都封閉起來,該封鎖的都封鎖了,不想讓這份以前情感再流露出去。

最好的方式,就是完全不要看到,不要想到。

忽然有種海闊天空的感概。