linux下的檔案緩衝IO

2021-07-06 05:29:36 字數 2341 閱讀 5425

1 dup / dup2

複製乙個現有的檔案描述符時,不會賦值檔案表。出現多個檔案描述符對應同一張檔案表的情況

dup()複製時系統會自動選擇乙個位置用的檔案描述符,通常選擇未使用的最小值

dup2()是程式設計師指定的新的檔案描述符,如果已被使用,則會強行關閉原始檔後繼續為我所有。

dup.c

他們經常用來重定向程序的stdin stdout stderr  

2.fcntl

#include

int fcntl(int fd, int cmd)

int fcntl(int fd, int cmd, long arg)

可以改變已開啟檔案的性質,提供5種控制檔案的功能:

2.1 複製乙個現有的檔案描述符 (f_dupfd)

複製檔案描述符,需要第三個引數作為新的檔案描述符值

和dup2的區別,則找到大於該值且未被使用的最小值代替。

fcntl.c

2.2 獲得或者設定檔案描述符標記(f_getfd f_setfd)

2.3 獲得或者設定檔案狀態(f_getfl f_setfl)

2.4 獲得後者設定非同步i/o所有權(...)

2.5 獲得或者設定記錄鎖(f_getlk f_setlk f_setlkw)(重點)

1)對於多程序同時操作乙個檔案,引入了鎖機制。檔案鎖機制解決的是多程序操作時操作同乙個檔案產生

資料衝突的問題。

2)同一程序內部檔案鎖沒有效果。檔案鎖允許多個程序同時讀,不允許同時寫。也循序多個程序同時讀

寫。因此檔案鎖分為讀鎖和寫鎖。

3)讀鎖針對讀操作,效果允許其它程序繼續給該檔案加讀鎖執行讀操作,但不允許給該檔案加寫操作執行

寫操作。

4)寫鎖針對寫操作,效果不允許其它程序繼續給該檔案加讀鎖或者寫鎖進行讀或者寫操作。

檔案愛你鎖的使用包含乙個函式 + 乙個資料結構

函式: fcntl()

資料結構:

struct flock

fcntl(fd, cmd, arg)

cmd取值:

f_getlk:測試是否可以加鎖

f_setlk:設定鎖狀態為lock.l_type, 加/解鎖

f_setlkw:加鎖的時候,如果加鎖不成功則一直等待,f

加鎖不成功fcntl()函式不會返回

檔案鎖的特點:

1)可以加鎖整個檔案,也可以加鎖檔案的一部分

lock1.c:a.txt 10~30 加讀鎖

lock2.c: a.txt 0~20  加讀鎖 成功

20~30 加寫鎖 失敗

2)上鎖的方式有兩種:

f_setlk:加鎖定失敗,立即返回-1

f_setlkw:wait,加鎖不成功不反回

lock3.c

3)檔案鎖其實並不能鎖定讀寫函式,只能阻止其它程序的加鎖行為,導致其它程序加不上鎖。

因此檔案鎖的正確用法:在呼叫read之前加讀鎖,在呼叫write之間加寫鎖,讀寫完之後立刻釋放鎖。

如果在加鎖之前可以獲取一下檔案鎖的狀態**一下加鎖是否成功。f_getlk

lock4.c:嘗試給a.txt 0~20 是否可以加讀鎖

20~50 是否可以加寫鎖

4)檔案鎖解決的是多程序操作同乙個檔案產生的資料衝突的問題,同乙個程序間的鎖無效

5)程序退出時,屬於該檔案的所有鎖均被釋放

6)建議性鎖,而非強制性鎖

3 stat函式

獲取硬碟上檔案的屬性資訊

ls -il

#include

#include

#include

struct stat

4 remove函式

#include

int remove(const char *pathname)

--------------------------------

標c:remove(filename)

uc:unlink(刪除乙個檔案)      

int unlink(const char *pathname)

刪除乙個檔案,要刪除的檔案正在被某個程序開啟或使用,其內容直到該檔案被關閉後才會正真刪除。

unlink1.c

unlink2.c

在實際專案中通常會使用一些臨時檔案時,當使用者開啟了該檔案就可以使用unlink()來刪除動作。

umask

5 其它的一些函式

access 檔案是否存在以及相關許可權

umask  為程序建立遮蔽字

chmod  改變檔案的許可權

chown  改變檔案的所有者

truncate 檔案截斷

create 建立檔案(幾乎沒人用,廢棄)

Linux 檔案IO 緩衝與非緩衝

本地普通檔案io一般關注的是快取,一般都是同步阻塞的。普通檔案的file descriptor是block也是posix標準。這點不同於網路io,網路io要考慮傳輸兩邊程序處理等,設計之初就提供了帶狀態檢測的非同步操作方式,本地檔案io則必然要求高可靠性的。不帶緩衝指的是每個read和write都呼...

Linux下的檔案管理函式(不帶I O緩衝)

1.creat 函式的作用 建立乙個檔案 函式的原型 int creat const char pathname,mode t mode 檔案頭 include sys types.h include sys stat.h include fcntl.h 返回值 成功 新的檔案描述符 出錯 1 建立...

linux不帶緩衝檔案IO

本博文設計的io不屬於ansi c的檔案io,所涉及的每乙個函式都是乙個系統呼叫。主要涉及posix.1的不帶快取的io操作的基礎部分。在linux核心中,對於乙個檔案的描述只需要乙個標示符即可。而不是乙個複雜的指標,僅僅是乙個int型的整數,有檔案描述符可以直接通過系統api直接操作核心資源,換句...