Linux 檔案操作

2022-08-30 01:45:09 字數 4176 閱讀 6668

檔案的作用

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...