Linux 檔案操作筆記

2021-08-09 10:19:04 字數 3967 閱讀 8837

一 講解open write read lseek close函式的使用

方法: 先講解每個函式的用法, 然後編寫**以具體的例子進行:

**檔名稱: open.c

**思路:

1 呼叫open函式新建乙個檔案

2 呼叫write函式寫檔案

3 呼叫lseek函式移動檔案指標到檔案頭部

4 呼叫read函式讀取檔案內容

5 呼叫close函式關閉檔案

注意點: 

1  當write完成寫操作之後, 檔案指標已經發生改變, 此時若想讀取剛剛

寫入的檔案內容,必須呼叫lseek函式移動檔案指標到檔案頭部,然後呼叫read

函式才能夠讀取到寫入的檔案內容.   

2  寫檔案和讀檔案都會使檔案指標發生變化, 特別注意的是讀和寫都是從檔案指標

的位置處開始的, 而且讀和寫共享同乙個檔案指標.

3  注意新建的檔案的許可權, 如何計算的mode & ~umask

二 perror和errno

1 errno是乙個全域性變數, 當呼叫系統函式或者是庫函式出錯之後, 會給errno賦乙個乙個整形值,每乙個errno的值

會對應乙個描述資訊, 描述了錯誤發生的原因.

2 通過man errno可以檢視errno值對應的描述資訊

3 perror這個函式能夠把errno對應的錯誤描述資訊列印出來, 類似於strerror函式,但比這個函式方便.

**示例: 

**檔名稱: perror.c

**思路:

1 呼叫open開啟乙個不存在的檔案

2 若open函式返回值為-1, 則呼叫perror函式列印錯誤資訊

三 阻塞和非阻塞

預設情況下, 檔案是非阻塞的, 終端裝置是阻塞的, 阻塞和非阻塞是檔案的屬性

**示例:     

**檔名稱: unblock_read.c

1 測試檔案是非阻塞的**思路:

1 呼叫open函式開啟乙個空檔案

2 呼叫read函式讀取檔案內容, 檔案沒有內容, 立刻返回-1

**檔名稱: block_read2.c

2 測試終端裝置是阻塞的**思路

1 呼叫read函式從終端裝置上讀取字串

2 若不輸入, 則會一直阻塞

**檔名稱: block_read1.c

3 通過測試開啟/dev/tty裝置檔案測試終端屬於阻塞裝置

1 呼叫open函式開啟/dev/tty檔案, 觀察返回的fd為3

2 若不輸入, 則會一直阻塞

四 使用lseek函式獲取檔案大小

**檔名稱:lseek1.c

**思路:

1 呼叫open函式開啟乙個檔案

2 呼叫lseek函式獲取檔案大小, n=lseek(fd, 0, seek_end);

可以使用wc -c 來驗證一下獲取的檔案大小是否正確

五 使用lseek函式實現檔案的拓展

**檔名稱:lseek2.c  

**思路:

1 呼叫open函式開啟乙個已存在的檔案

2 呼叫lseek函式實現檔案拓展 lseek(fd, 100, seek_end);

3 呼叫write函式進行一次寫操作

注意: 最後必須呼叫write函式進行一次寫操作,否則不能實現檔案拓展\

六 stat函式獲取檔案屬性資訊

1 使用stat函式獲取檔案大小

**檔名稱:stat1.c 

**思路:

1 呼叫stat函式獲取指定檔案的屬性資訊

2 呼叫printf函式列印出st_size的大小

2 使用stat函式檢視檔案的許可權資訊和檔案型別

**檔名稱:stat2.c

**思路:

1 呼叫stat函式獲取檔案屬性資訊

2 判斷檔案所屬使用者的許可權

3 判斷檔案型別

注意: 判斷檔案型別的其他方法: 請檢視man 2 stat

s_isreg(m)  is it a regular file?

s_isdir(m)  directory?

s_ischr(m)  character device?

s_isblk(m)  block device?

s_isfifo(m) fifo (named pipe)?

s_islnk(m)  symbolic link?  (not in posix.1-1996.)

s_issock(m) socket?  (not in posix.1-1996.)

the preceding code snippet could thus be rewritten as:

stat(pathname, &sb);

if (s_isreg(sb.st_mode))

七 比較stat和lstat

首先要建立乙個軟連線, 然後分別用stat函式和lstat函式獲取檔案大小

**檔名稱: lstat.c

**思路:

1 呼叫stat函式獲取乙個普通檔案/軟鏈結的屬性資訊

2 呼叫lstat函式獲取乙個普通檔案/軟體的屬性資訊

3 分別列印出二者的大小

分析比較後最後得出結論:

對於普通檔案來說, stat函式和lstat獲取的是一樣的, 沒有區別

對於軟鏈結檔案來說, stat函式獲取的是軟連線檔案指向的檔案, 

lstat獲取的是獲取的是鏈結檔案本身.

八 目錄遍歷相關的函式

opendir  readdir  closedir的用法

**檔名稱: opendir.c

**思路:

1 呼叫opendir函式開啟乙個目錄

2 進入while迴圈:----迴圈退出條件是: readdir返回null,目錄項讀完

若檔名第乙個字元為. 則直接continue跳過

列印出檔名

判斷檔案型別,列印檔案型別

3 呼叫closedir關閉目錄

學生的作業:

統計某個目錄下普通檔案的總數, 遞迴列出所有目錄的檔案

九 dup和dup2函式

使用dup函式複製檔案描述符,驗證複製後的檔案描述符和原檔案描述符指向同乙個檔案

**檔名稱:dup.c

**思路: 

1 使用open函式新建乙個檔案, 返回乙個檔案描述符fd1

2 使用dup函式複製乙個新的檔案描述符fd2

3 使用fd2進行寫檔案操作, 寫完後關閉檔案描述符fd2

4 使用fd1進行檔案讀操作, 並列印讀出的內容

5 關閉檔案描述符fd1

結論: 經dup函式呼叫複製的檔案描述符與原檔案描述符指向同乙個檔案, 

通過fd2對檔案的操作會引起檔案指標的變化, 這個變化會在fd2這個檔案描述

上表現出來.

使用dup2函式複製乙個檔案描述符:

**檔名稱:dup2.c

**思路:

1 呼叫open函式新建乙個檔案, 返回乙個fd1

2 呼叫open函式新建乙個檔案, 返回乙個fd2

3 呼叫dup2函式複製fd1到fd2上

4 通過fd2寫檔案, 通過fd1讀檔案

思考: 使用dup2函式實現將printf語句的輸出到檔案中

十 fcntl函式用法:

複製檔案描述符: 

**檔名稱:fcntl.c

**思路:

1 呼叫open函式新建乙個檔案, 返回乙個fd1

2 呼叫dup2函式複製fd1到fd2上

3 通過fd2寫檔案, 通過fd1讀檔案   

2 獲取檔案描述符標識和設定檔案描述符標識    

**檔名稱:fcntl1.c

**思路:

1 呼叫open函式開啟乙個檔案--該檔案已經存在了

2 呼叫fcntl函式獲得該檔案描述符的狀態

4 呼叫write函式寫乙個字元到檔案中

驗證: 開啟檔案, 看看寫入的字串是否覆蓋了原有檔案的內容  

Linux 操作筆記

為了熟練使用,抽空學習了下linux系統,做了些筆記 bin bin 是 binary 的縮寫。這個目錄存放著最經常使用的命令。boot 這裡存放的是啟動 linux 時使用的一些核心檔案,包括一些連線檔案以及映象檔案。dev dev 是 device 裝置 的縮寫。該目錄下存放的是 linux 的...

linux操作筆記

linux檢視操作歷史 ps ef 檢視gpu狀態 watch nvidia smi linux檢視後台任務狀態 ps aux linux一次性殺掉多個程序 ps ef grep python grep v grep cut c 9 15 xargs kill 9其中第二個分命令表示所有含pytho...

nodejs檔案操作筆記

nodejs新增了流的概念,通過流操作檔案如行雲流水,比早前便利暢快多了。先來第乙個例子,我們建乙個stream.js檔案,裡面內容如下 var fs require fs var a fs.createreadstream source.txt a.pipe fs.createwritestrea...