系統程式設計(檔案操作續) C語言學習(3)

2021-07-15 08:32:57 字數 1831 閱讀 2007

今天總結一下檔案操作,主要包括兩部分,檔案描述符的控制和my_ls的實現。

1.對檔案描述符進行控制操作以改變一開啟檔案的屬性,fcntl函式原型如下

int

fcntl(int fd, int cmd);

intfcntl(int fd, int cmd, long arg );

intfcntl(int fd, int cmd, struct flock

*flock);

struct flock

這裡主要談涉及到檔案記錄鎖的第三種形式。

檔案記錄鎖

檔案記錄鎖是當多個程序同時對檔案進行操作時,通過鎖限制程序對檔案的操作,比如讀鎖(f_rdlck)允許一塊檔案內容多個程序同時讀,而寫鎖(f_wrlck)對一塊檔案內容只允許乙個程序寫。而兩種所互不相容,即對於乙個位元組只能存在一種型別的鎖

此時cmd引數有三種形式:f_setlk,f_setlkw,f_getlk.

1.f_setlk 設定鎖,我理解為按flock指向的結構體中的資訊對fd進行設定

2.f_setlkw 與上一條相似,但當希望設定的鎖由於已經存在了其他鎖而被阻止時,會等待直到那鎖被釋放。

3.f_getlk 檢測能否設定鎖,如果可以將lock的l_type設定為f_unlck否則返回存在衝突的一種鎖的結構。

當設定鎖時,流程如下(以設定寫鎖為例)

struct flock lock;

memset(&lock, 0, sizeof(struct flock)); //初始化結構體

lock.l_type = f_wrlck;//設定要寫的屬性包括whence等

if((fcntl(fd, f_getlk, lock)) == 0) //測試

else

}else

lock.l_type = f_wrlck;

if((fcntl(fd, f_setlk, lock)) == 0)

else

return

0;

2.my_ls的實現

感覺並不是很難,但確實有一些地方做的不好。

下面以-rl引數作為代表說一下

我的函式呼叫傳遞的形參為檔案路徑,用opendir函式開啟要檢視的目錄,返回的dir指標再傳遞給readdir函式用來找到ptr指標,從而得到檔名,再有檔名通過stat函式讀取檔案資訊存放在結構體陣列file中,因為結構體stat中沒有成員變數儲存檔名,於是我又定義了乙個指標陣列用來記錄檔名,也方便對檔名排序。

int my_readir_rl(const

char *path)

/*將程序的當前工作目錄轉換為要檢視的目錄*/

chdir(path);

printf("----------------- %s------------------\n",path);

//通過ptr獲取檔名

while((ptr = readdir(dir)) != null&&i < 99)

i++;

}//按照檔名進行排序

bubble_sort(i);

//將檔案許可權由mode_t轉換為rwx的字串

change_mode_t(i);

//列印資訊

print(i);

//將之前記錄的子目錄絕對路徑再次呼叫函式讀取顯示資訊

for(tem =0; tem < key; tem++)

return

0;}

沒有採用鍊錶的資料結構,導致並不能顯示太多的檔案資訊。

C 語言學習筆記 檔案操作

入門級學習c 語言,避免不了想讓自己的程式能和外界打交道,哪怕是乙個 txt 的記事本,那麼怎麼實現檔案的操作,這裡只是舉個小例子,還有待開發和修正哈 如果是只是為了研究這個操作怎麼寫,就建立乙個 c 的命令列工程就行了,我這裡是為了做上位機,整了個windows的窗體設計,隨便畫了個介面,顯示一下...

C語言學習之檔案操作

開啟檔案 fopen 需要判斷是否成功開啟,開啟失敗返回null 操作檔案 讀檔案 fread 寫檔案 fwrite 關閉檔案 fclose 需要判斷檔案指標是否為空 file fopen const char pathname,const char mode file 返回檔案指標,若開啟失敗,返...

Linux 系統程式設計學習 檔案I O操作

一 非緩衝檔案操作 執行非緩衝檔案操作後,應用程式將立即獲取或傳送資料,非緩衝檔案操作的函式只有 read write 從檔案中將資訊講到到指定的記憶體區域中read 檔案識別符號,記憶體塊指標,記憶體塊長度 返回值是實際讀取的長度,沒有讀取到資料返回0,錯誤返回1 檔案識別符號可使用open 函式...