今天總結一下檔案操作,主要包括兩部分,檔案描述符的控制和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 函式...