【Chapter4*重點總結一*】檔案刪除以及du和df的區別
阿新 • • 發佈:2018-11-09
一、unlink檔案
看下面的刪除檔案程式碼,如果在執行前、執行中(睡眠的15秒)、執行後分別檢視磁碟空間大小,會有什麼不同呢?
//刪除一個檔案,並且在15秒後關閉程式 #include"apue.h" #include"fcntl.h" int main(int argc,char* argv[]) { int fd; if(argc<2){ err_sys("請輸入要刪除的檔名!感謝哈~"); } if((fd=open(argv[1],O_RDONLY))==-1){ err_sys("開啟檔案失敗!\n"); } printf("已開啟該檔案\n"); if(unlink(argv[1])==-1){ err_sys("刪除檔案失敗,寶寶也不知道哪裡錯了哦~"); } printf("刪除檔案成功\n"); sleep(15); printf("停止睡眠,現在可以做其他事情了哦~\n"); exit(0); }
執行前檢視磁碟空間大小:可用空間是2.9G
[email protected]:~/Unix_Code/Chapter4$ df -h /home
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 19G 15G 2.9G 84% /
執行中檢視磁碟空間大小:仍為2.9G
[email protected]:~/Unix_Code/Chapter4$ ./4-8 1.mp4
已開啟該檔案
刪除檔案成功
[email protected]:~/Unix_Code/Chapter4$ df -h /home Filesystem Size Used Avail Use% Mounted on /dev/sda1 19G 15G 2.9G 84% /
執行結束後再檢視磁碟空間大小,為3.2G
[email protected]:~/Unix_Code/Chapter4$ ./4-8 1.mp4
已開啟該檔案
刪除檔案成功
停止睡眠,現在可以做其他事情了哦~
[email protected]:~/Unix_Code/Chapter4$ df -h /home
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 19G 15G 3.2G 82% /
明明程式已經刪除了檔案,在睡眠的15秒鐘,在檢視磁碟大小時,為什麼沒有釋放呢?這就取決於刪除檔案的兩個注意:
1.檔案硬連結數為0,目錄項刪除
2.如果有程序開啟檔案時,i節點不會被刪除。直到檔案被關閉同時連結數為0,才會刪除i節點
程式中滿足連結數為0(unlink),但由於之前已經open了這個檔案,沒有釋放,造成了控制代碼洩露。直到程式結束時,才釋放檔案描述符。這時滿足第二個條件才會刪除i節點,釋放空間。假如程式中close(fd),這時會立刻刪除檔案。
二、du和df命令區別
檢查磁碟空間大小,有兩個命令可選擇,du檢視檔案佔用磁碟塊大小,df檢視檔案系統可用空間。
[email protected]:~/Unix_Code/Chapter4$ du 4-8.c
4 4-8.c
[email protected]:~/Unix_Code/Chapter4$ df -h /home
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 19G 15G 3.2G 82% /
但在刪除檔案時,du和df命令會有差別。
du(disk usge)逐級進入指定目錄的子目錄,統計子目錄的檔案佔用資料塊大小,可理解為使用者級程式。
df(disk free)是檢查檔案系統的磁碟佔用情況。檔案系統會在磁碟上存放自身的資料,例如超級快、自舉塊、i節點圖等,這些成為Meta Data。檢查時利用i節點的查詢獲取磁碟可用大小,考慮Meta Data,而du是不考慮Meta Data的。
參考:http://yanue.net/post-89.html
三、思考
對於刪除檔案的程式,使用的是df命令,如果使用du呢,會出現什麼情況?