1. 程式人生 > >【Chapter4*重點總結一*】檔案刪除以及du和df的區別

【Chapter4*重點總結一*】檔案刪除以及du和df的區別

一、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呢,會出現什麼情況?