作為一名c++後台開發程式設計師,在這個領域需要不斷的學習進步,才能夠穩定前行。對於畢業工作了一年的我,在著期間,對於linux系統可以說是很少接觸,因為現在的專案主要是windows專案。但是,個人認為,作為後台開發工程師,linux系統的學習是必須的,最起碼要熟悉linux系統。而對於幾乎沒接觸過linux系統的我來說,學習linux系統要從零開始。但是這些不重要,重要是的肯學。所以利用閒餘時間自學linux系統。當然,最基礎的就是一邊看書一邊動手實踐學習。但是很多時候,看書時可以明白理解,但是過了一段時間,如果沒有使用到看書所學的知識,很快就會給遺忘掉。為此,我通過寫部落格的來記錄我看書過程中學到的知識總結,以便之後若忘記可以翻看自己的部落格來回憶所學知識,同時也希望總結出來的這些linux系統知識能夠幫助到有需要的人。當然,寫部落格不僅僅是這個目的。。好了,廢話不多說(畢竟本人第一次寫部落格,有點囉嗦)。開始記錄我學習linux的路程。
今天主要是學習了linux的檔案相關的系統i/o函式。這些i/o函式包括了open、create、read、write、lseek、close、dup、dup2等函式。這些檔案操作函式,相比一般c++程式設計師都會了解,c++標準庫都有自帶的標準i/o操作,但這裡記錄的是linux系統自帶的i/o操作函式。
在學習這些函式之前,需要先了解linux系統的程序間的檔案共享和管理的問題。系統核心為了維持程序與檔案之間的關係,定義了三個結構體。
1、程序表:核心維護一張程序表,記錄每乙個程序項,程序項中維持了一張在該程序中所有的開啟的檔案描述符,每個檔案描述符記錄了問價描述符標誌和檔案表項。
3、v節點表:核心位置一張v節點表,記錄所有開啟的v節點,v節包含v節點資訊以及i節點資訊,每乙個開啟的檔案有乙個v節點結構,v節點中包含的i節點(索引節點)記錄了檔案的詳細資訊,例如記錄了檔案的長度,在盤中的位址等具體資訊。
程序之間對檔案的管理就是通過這個三張表的關係層層連線。乙個程序開啟乙個未開啟的檔案時候,就會生成產生檔案描述符、檔案表項一v節點結構,來記錄這個檔案的詳細資訊,如若另外乙個程序開啟與該程序相同的檔案時候,則在另外乙個程序中只會生成乙個當前程序下的檔案描述符和乙個檔案表項,但是是不會在生成v節點結構,乙個開啟的檔案有且只有乙個v節點結構,也就是兩個程序的檔案表項就會共用該v節點。最後給出一張圖,幫助理解。如下圖所示(開啟檔案的核心將資料結構):
說完上面檔案知識之後,下面就是i/o系統函式:
open與create函式:open函式與create函式都可以開啟乙個檔案,區別是create只能建立開啟乙個只寫的檔案,open函式可以開啟或者建立乙個可讀、可寫或者可讀寫的檔案,功能更為多樣。函式成功均返回乙個檔案描述符,否則返回-1.
//@param pathname 需要開啟或者建立的檔案的路徑名
//@param flag 檔案狀態標誌(這裡列出常用的幾個狀態標誌)
//o_wronly/o_rdonly/rdwr 分別為可寫、可讀和可寫可讀標誌,三者不能共存,只能有其中乙個
//o_creat 若果檔案不存在就建立該檔案,若果設定了該狀態標誌的,就要使用第三個引數mode指定建立的檔案相關許可權
//o_excl 如果同時指定該標誌和o_creat標誌,則如果指定開啟的檔案存在則函式返回開啟時失敗。
//o_trunc 若果檔案存在,而且指定唯讀或者只寫成功開啟,則會將制定檔案長度截斷為零。
//o_nonblock 設定檔案描述符為非阻塞。
//o_noctty 如果pathname指的是終端裝置,則不將裝置作為此程序的控制終端。
//o_sync 每次寫操作都要阻塞等待物理i/o操作完成後才返回
int open(const char *pathname, int flag);
int open(const char *pathname, int flag, mode_t mode);
int creat(const char *pathname, mode_t mode);//在這裡不管設定mode為可讀或者可寫或者可讀寫,只要該函式返回成功就只會是可寫檔案描述符
close函式:雖然說程序結束後,會自動關閉所有開啟的檔案描述符,但是還是希望程式設計師自己手動關閉。函式成功返回0,失敗返回-1。
//@param fd 需要關閉檔案的檔案描述符
int close(int fd);
lseek函式:lseek函式的呼叫指揮導致檔案指標的偏移,而不會導致i/o操作。函式成功返回檔案新的位移,失敗返回-1.
//@param fd 指定檔案的檔案描述符
//@param offset 一般為非負數(有的linux系統支援負數,但是很少), 需要檔案指標偏移的偏移量大小
//@param whence 偏移方式,值有seek_set/seek_cur/seek_end
1、seek_set 將檔案指標移動到距離檔案開始位置為offset的地方
2、seek_cur 將檔案指標從當前位置開始移動offset
lseek(int fd, off_t offset, int whence);
read函式和write函式:分別為讀取檔案內容和寫入檔案的函式。函式特點類似,函式讀取或者寫入成功都會返回乙個數值,標識成功讀取或者寫入的位元組數,如果失敗均返回-1。
//@param fd 需要操作的檔案的檔案描述符
//@param buf 用來接收讀取資料的換沖區或者用來寫入資料的換沖區
//@param count 換衝區的大小
size_t read(int fd, void *buf, size_t count);
size_t write(int fd, void *buf, size_t count);
接下來,就是dup函式和dup2函式。這兩函式作用本質上的作用是一樣,就是複製乙個檔案描述符。兩個函式成功時候都返回乙個檔案描述符,失敗返回-1。但是dup2可以說dup函式的加強版。呼叫dup函式成功時候,返回的是當前程序下未開啟的檔案描述符的最小檔案描述符。但是dup2函式則可以指定乙個檔案描述符作為目的檔案描述符,成功後就返回指定的檔案描述符。dup2函式在底層的實現是如果目的檔案描述符已經開啟,則先將其關閉,然後再對該檔案描述符賦予新值。最重要的一點是,要區分清楚,使用這兩個函式複製返回的檔案描述符指向同乙個檔案表項,而不是像程序間開啟同意檔案,兩個程序間各自產生乙個檔案表項。
//@param oldfd 需要複製的檔案描述符
//@param newfd 將需要複製的檔案描述符複製到的指定檔案描述符
int dup(int oldfd);
int dup2(int oldfd, int newfd);
好了,今天先寫這麼多,一點一點記錄學習過程,希望能夠幫助自己,也能夠幫助他人。
Linux檔案IO之ext檔案系統
2 ext2檔案系統 3 目錄與檔案 ext是linux比較通用的檔案系統,全稱延伸檔案系統,又稱擴充套件檔案系統。其中ext2是ext檔案系統版本中第乙個商用檔案系統版本,後續的ext3和ext4都是在此基礎上優化。所有磁碟都有乙個mbr頭和至多4個主分割槽組成。mbr叫主引導記錄,位於磁碟第乙個...
基礎IO 和 Linux 的檔案系統
基礎io 標準庫io介面 linux下系統呼叫io介面 檔案描述符 重定向 檔案系統 庫檔案 標準庫的io介面 fopen fwrite fread fseek fclose fread fwrite 比較推薦塊帶下為1,塊個數是想要操作的資料長度 feek 檔案沒有資料也可以跳轉讀寫位置 對檔案資...
linux 檔案系統 Linux 檔案系統結構介紹
ubuntu 像所有類unix系統一樣 在分層樹中組織檔案,其中的關係就像父母和孩子一樣。目錄可以包含其他目錄以及常規檔案,它們是樹的 葉子 樹的任何元素都可以通過路徑名引用 絕對路徑以字元 標識根目錄,其中包含所有其他目錄和檔案 開頭,然後列出必須遍歷以到達該元素的每個子目錄,每個子目錄用 符號分...