Linux驅動之檔案作業系統呼叫

2021-08-26 15:02:50 字數 3323 閱讀 9441

1.1 檔案作業系統呼叫

linux的檔案作業系統呼叫涉及建立,開啟,讀取和關閉檔案。

1.1.1 建立

int creat(const char *filename, mode_t mode);
引數mode指定新建檔案的訪問許可權,它同umask一起決定檔案的最終許可權(mode & umask),其中umask代表了檔案在建立時需要去掉的一些訪問許可權。umask可通過系統呼叫umask()來改變:

int umask(int newmask);
該呼叫將umask設定為newmask,然後返回舊的umask,它只影響讀,寫和執行許可權。

1.1.2  開啟

int open(const char *pathname, int flags);

int open(const char *pathname, int flags, mode_t mode);

open()函式有兩個形式,其中pathname是我們要開啟的檔名(包括路徑名稱,預設是認為在當前路徑下面),flags可以是下面的乙個值或是幾個值的組合:

檔案開啟標誌 標誌

含義o_rdonly

以唯讀的方式開啟檔案

o_wronly

以只寫的方式開啟檔案

o_rdwr

以讀寫的方式開啟檔案

以追加的方式開啟檔案

o_create

建立乙個檔案

o_exec

如果使用了o_creat而且檔案已存在,就會發生乙個錯誤

o_noblock

以非阻塞的方式開啟乙個檔案

o_trunc

如果檔案已經存在,則刪除檔案的內容

o_rdonly,o_wronly,o_rdwr三個標誌只能使用任意乙個。

如果使用了o_create,則使用的函式是open(const char *pathname, int flags, mode_t mode);這個時候我們還要指定mode標誌,用來表示檔案的訪問許可權。mode可以是下面所列值的組合。

檔案訪問許可權 標註

含義s_irusr

使用者可以讀

s_iwusr

使用者可以寫

s_ixusr

使用者可以執行

s_irwxu

使用者可以讀,寫,執行

s_irgrp

組可以讀

s_iwgrp

組可以寫

s_ixgrp

組可以執行

s_irwxg

組可以讀,寫,執行

s_iroth

其他人可以讀

s_iwoth

其他人可以寫

s_ixoth

其他人可以執行

s_irwxo

其他人可以讀,寫,執行

s_isuid

設定使用者的執行id

s_isgid

設定組的執行id

除了可以通過上述巨集進行「或」邏輯產生標誌以外,我們也可以用數字來表示,linux用5個數字來表示檔案的各種許可權:

第一位表示設定使用者id;第二位表示設定組id;第三位表示使用者自己的許可權位;第四位表示組的許可權;第五位表示其他人的許可權。每個數字可以取0(無許可權), 1(執行許可權), 2(寫許可權), 4(讀許可權)或是這些值得和。

例如,要建立乙個使用者可讀,可寫,可執行;但是組沒有許可權;其他人可以讀,可執行的檔案,並設定使用者id位。那麼,我們應該使用的模式是1(設定使用者id),0(不設定組id),7(1+2+4,讀,寫,執行),0(組沒許可權),5(1+4, 讀,執行),即10705:

open("test", o_creat, 10705);

上述的語句等價於:

open("test", o_creat, s_irwxu | s_iroth | s_ixoth | s_isuid);

如果檔案開啟成功,open函式會返回乙個檔案描述符,以後對該檔案的所有操作就可以用過對這個檔案描述符進行操作來實現。

1.1.3 讀寫

在檔案開啟後,我們才可以對檔案進行讀寫操作,linux中提供檔案讀寫的系統呼叫時read,write函式:

int read(int fd, const void *buf, size_t length);

int write(int fd, const void *buf, size_t length);

其中引數buf為指向緩衝區的指標,length為緩衝區的大小(以位元組為單位)。函式read()實現從檔案描述符fd所指定的檔案中讀取length位元組到buf所指向的緩衝區中,返回值為實際讀取的位元組數。函式write()實現將length個位元組從buf指向的緩衝區中寫到檔案描述符fd所指向的檔案中,返回值為實際寫入的位元組數。

1.1.4 定位

對於隨機檔案,我們可以隨機地指定位置讀寫,使用如下的函式進行定位:

int lseek(int fd, offset_t offset, int whence);

lseek()將檔案讀寫指標相對whence移動offset個字。操作成功時,返回檔案指標相對於檔案頭的位置。引數whence可以是:

seek_set: 相對檔案開頭

seek_cur: 相對檔案讀寫指標的當前位置

seek_end: 相對檔案末尾

offset 可以取負值。由於lseek函式返回值為檔案指標相對於檔案頭的位置,因此下列呼叫的返回值就是檔案的長度:

lseek(fd, 0 , seek_end);

1.1.5 關閉

當我們操作完成後,要關閉檔案,只要呼叫close就可以了。其中fd是我們要關閉的檔案描述符:

int close(int fd)

例程:編寫乙個程式,在當前目錄下建立使用者可讀寫檔案test.txt,在其中寫入"test file operation function",關閉該檔案。再次開啟此檔案,讀物其中的內容並輸出到螢幕上。

#include #include #include #include int main(void)

fd = open("test.txt", o_rdwr);

len = read(fd, str, 100);

str[len] = '\0';

printf("%s \n", str);

close(fd);

return 0;

}

作業系統引數調優

1 同時開啟的檔案描述符和網路連線數 ulimit net.core.somaxconn 2 關閉swap分割槽 3 設定合理的預讀取緩衝區大小 blockdev命令 4 檔案系統選擇 ext3 ext4 xfs等 在linux檔案系統中,當檔案被建立,修改和訪問時,linux系統會記錄這些時間資訊...

現代作業系統 之檔案

通過提取處理器的概念,我們建立了程序的抽象,通過提取物理儲存器的概念,我們建立了虛擬記憶體的抽象,同樣通過提取磁碟等永久性儲存器的概念,我們建立了檔案的抽象。檔案是用來對磁碟建模的,是程序建立的資訊邏輯單元。檔案是受作業系統管理的,作業系統中管理檔案的部分稱為檔案系統。檔案的命名規則在不同的系統中是...

Linux 作業系統之執行緒

程序部落格 執行緒 在乙個程式裡的乙個執行路線就叫做執行緒 thread 更準確的定義是 執行緒是乙個程序內部的控制序列。一切程序至少都有乙個執行執行緒。程序與執行緒 1.程序是資源競爭的基本單位。2.執行緒是程式執行的最小單位。3.執行緒共享程序資料,但也擁有自己的一部分資料。4.linux下的執...