【Linux】基礎IO(下)!!!

doctor_xiong發表於2018-01-15

在C庫裡面的IO函式在底層也是通過呼叫系統的IO函式來實現的。因為在系統IO函式裡面是通過fd(檔案描述符)實現的,所以在C庫裡面是將fd(檔案描述符)進行了封裝。

在C庫函式向顯示器輸出的時候是行緩衝,但是在向檔案輸出的時候是全緩衝,因為在系統提供的函式裡面是沒有自帶緩衝區的,所以在C庫函式封裝的時候提供的。


int main()
{
    char * buf = "haha\n";
    fwrite(buf,strlen(buf),1,stdout);
    fork();
    return 0;
}

結果是:
這裡寫圖片描述

再將上面的結果重定向之後./a.out > hehe.txt
結果是:
這裡寫圖片描述

注:在這裡當輸出是輸出到螢幕的時候是行緩衝,但是在重定向之後就將行緩衝變成了全緩衝,所以當執行fork之前不一定會將輸出資料輸出,有可能在fork之後,而在fork之後含有一個子程式,子程式包含的緩衝資料和父程式一樣,所以在這裡面就會在檔案裡面輸出兩個相同的資料。

檔案系統:
這裡寫圖片描述
超級快:存放檔案系統的資訊
i結點表:存放檔案的基本資訊
資料區:存放資料內容

inode結構:
在linux裡面每個問價 都對應這一個inode號,在系統區別檔案的時候也是依靠inode號來實現區分的,在這個inode裡面儲存這檔案系統的基本資訊,除開檔名。

顯示inode資訊:stat filename
顯示inode號和檔名:ls -i filename
顯示inode總數和已使用inode數:df -i

在系統裡面開啟一個檔案是通過一個叫目錄檔案來尋找的,這個目錄檔案的裡面含有所有檔案的inode和檔名,在需要訪問檔案資訊的時候就會進入inode裡面將檔案的資訊輸出。
如圖:
這裡寫圖片描述

硬連結:
使用in filename1 filename2可以將filename1filename2硬連結起來。
這裡寫圖片描述

在底層可以發現,實現硬連結的兩個檔案的inode號會一樣的,那麼就可以得出結論,在實現硬連結的時候其實是將兩個檔案公用一個inode號。

軟連線:
軟連線ln -s filename1 filename2是建立一個新的檔案,訪問這個檔案的時候就會通過連線去訪問原始檔案。

相關文章