檔案的作用
linux中,一切皆檔案(網路裝置除外)
硬體裝置也「是」檔案,通過檔案來使用裝置
目錄(資料夾)也是一種檔案
linux的檔案結構
了解各主要資料夾的作用
系統呼叫和裝置驅動程式之間的關係
應用層的open, close, read, write, ioctl與驅動程式的關係
檔案操作方式
0) 檔案描述符
是乙個》=0的整數
每開啟乙個檔案,就建立乙個檔案描述符,通過檔案描述符來操作檔案
預定義的檔案描述符:
0:標準輸入,對應於已開啟的標準輸入裝置(鍵盤)
1:標準輸出,對應於已開啟的標準輸出裝置(控制台)
2. 標準錯誤, 對應於已開啟的標準錯誤輸出裝置(控制台)
多次開啟同乙個檔案,可得到多個不同的檔案描述符。
1) 使用底層檔案操作(系統呼叫)
比如:read
可使用man 2 檢視
2) 使用i/o庫函式
比如:fread
可使用man 3 檢視
底層檔案操作(關於檔案的系統呼叫)
1) write(int fd , char* buff ,int size_t);
(1) 用法
man 2 write
(2) 返回值
成功:返回實際寫入的位元組數
失敗:返回 -1
注意:是從檔案的當前指標位置寫入!
檔案剛開啟時,檔案的位置指標指向檔案頭
例項:main1.c
2) read
(1)用法
man 2 read(int fd, char * buff , int size_t);
(2)返回值
0 : 實際讀取的位元組數0 : 已讀到檔案尾
-1 :出錯
注意:引數3表示最多能接受的位元組數,而不是指一定要輸入的位元組數
例項:main2.c
執行:# ./a.out /* 使用者輸入回車符時結束輸入 */
# ./a.out < main.c /* 利用重定向, 使用檔案main.c作為輸入 */
example: open("/dev/hello", o_rdonly|o_creat|o_excl, 0777)
(4) 引數3 (設定許可權)
當使用o_creat時,使用引數3
s_i(r/w/x)(usr/grp/oth)
例:s_irusr | s_iwusr 檔案的所有者對該檔案可讀可寫
(八進位制表示法)0600 檔案的所有者對該檔案可讀可寫
注意:返回的檔案描述符是該程序未開啟的最小的檔案描述符
4) close
(1) 用法
man 2 close(file_fd)
終止指定檔案描述符與對應檔案之間的關聯,
並釋放該檔案描述符,即該檔案描述符可被重新使用
(2)返回值
成功: 0
失敗: -1
例項:使用read/write實現檔案複製
main3.c
main4.c
觀察耗時
./a.out
time ./a.out
補充:time命令
time目錄分別輸出:
程式總的執行時間、
該程式本身所消耗的時間、
系統呼叫所消耗的時間
5) lseek
(1) 用法
man 2 lseek(file_fd , 要偏移字元數,檔案指標定位 ) (檔案指標是個結構體)
(2) 返回值
成功:返回新的檔案位置與檔案頭之間偏移
失敗: -1
例項:拷貝乙個檔案尾部的100個位元組到另乙個檔案
main5.c
6) ioctl
用來控制裝置.
beep例項
標準i/o庫
直接使用系統呼叫的缺點
(1) 影響系統效能
系統呼叫比普通函式呼叫開銷大
因為,系統呼叫要進行使用者空間和核心空間的切換
(2) 系統呼叫一次所能讀寫的資料量大小,受硬體的限制
解決方案: 使用帶緩衝功能的標準i/o庫(以減少系統呼叫次數)
/* c語言中的檔案操作中已描述 */
1) fwrite
2) fread
3) fopen
4) fclose
5) fseek
6) fflush
proc檔案系統
/proc是乙個特殊的檔案系統,
該目錄下檔案用來表示與啟動、核心相關的特殊資訊
1) /proc/cpuinfo
cpu詳細資訊
2) /proc/meminfo
記憶體相關資訊
3) /proc/version
版本資訊
4) /proc/sys/fs/file-max
系統中能同時開啟的檔案總數
可修改該檔案
5) 程序的相關資訊
/proc/32689/ 表示指定程序(程序號為32689)的相關資訊
6) /proc/devices
已分配的字元裝置、塊裝置的裝置號
檔案鎖
1) 併發對檔案i/o操作的影響
解決辦法?
2)檔案鎖
用法:man 2 fcntl
檔案鎖的表示
struct flock
詳解:用法:
includeincludeint
fcntl(int fd, int cmd);
intfcntl(int fd, int cmd, long arg);
intfcntl(int fd, int cmd, struct flock
*lock);
引數:
fd:檔案描述詞。
cmd:操作命令。
arg:供命令使用的引數。
lock:同上。
有以下操作命令可供使用
一. f_dupfd :複製檔案描述詞 。
二. fd_cloexec :設定close-on-exec標誌。如果fd_cloexec位是0,執行execve的過程中,檔案保持開啟。反之則關閉。
三. f_getfd :讀取檔案描述詞標誌。
四. f_setfd :設定檔案描述詞標誌。
五. f_getfl :讀取檔案狀態標誌。
七. f_getlk, f_setlk 和 f_setlkw :獲取,釋放或測試記錄鎖,使用到的引數是以下結構體指標:
f_setlk:在指定的位元組範圍獲取鎖(f_rdlck, f_wrlck)或者釋放鎖(f_unlck)。如果與另乙個程序的鎖操作發生衝突,返回 -1並將errno設定為eacces或eagain。
為了設定讀鎖,檔案必須以讀的方式開啟。為了設定寫鎖,檔案必須以寫的方式開啟。為了設定讀寫鎖,檔案必須以讀寫的方式開啟。
struct flock 的設定:
struct flock flock;
flock.l_type = type; 檔案鎖 的型別 讀鎖 寫鎖
flock.l_whence = seek_set; 定位
flock.l_start = 0; 偏移量
flock.l_len = 0; 讀取長度
flock.l_pid = -1; 檔案描述符
設定檔案鎖時 可以封裝為乙個函式 int flock_set(int fd, int type);
檔案鎖的操作 int fcntl(int fd, int cmd , struct flock *lock); cmd 獲取 釋放 測試
2)例項
main6.c
linux 檔案操作
1 cat 開啟檔案 cat name.txt 開啟檔案name.txt cat 1.txt 2.txt 開啟2個檔案 cat n name.txt 開啟檔案後顯示行號 2 vi 輸出,刪除,查詢,替換,塊操作 等文字操作 vi 的三種基本工作模式 命令列模式,文字輸入模式,末行模式 命令列模式 不...
Linux 檔案操作
1,查詢檔案 find name 名稱 ls find atime 10 記著有乙個點號 兩邊都有空格,代表當前目錄,如果希望顯示系統的所有大於10天的檔案 可以將 換成 代表根目錄 find mtime n print n天前那天改過的檔案 find mtime n print n天以前改過的檔案...
linux檔案操作
unix檔案操作 讀寫操作 標c檔案讀寫 file 代表乙個開啟的檔案 unix linux的檔案讀寫函式 linux系統中 幾乎一切都是檔案,記憶體 目錄 硬體裝置都可以看成檔案。比如 記憶體 對應目錄 proc pid 目錄 可以用 vi 檢視,也是檔案 裝置 dev tty 鍵盤 顯示器 de...