一 講解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...