文章目錄
- 1. 檔案描述符
- 2. 重定向原理
- 3. 動態庫與靜態庫的生成與使用
- 1). 鏈接方式
- 2). 庫的生成
- 3). 庫的使用
1. 檔案描述符
- 系統呼叫IO介面的操作句柄 --非負整數;
- 本質:內核中行程打開的檔案描述資訊表中的下標;
- 檔案描述符與檔案流指標
· 檔案描述符:int ,系統呼叫IO介面的操作句柄;
· 檔案流指標:FILE* ,庫函式IO介面的操作句柄;
· 庫函式與系統呼叫介面的關系:庫函式封裝了系統呼叫介面;
·· 通過庫函式進行IO操作,最終是會歸納到使用系統呼叫介面完成IO操作, - 庫函式IO與系統呼叫IO的區別:
· 緩沖區:通常所說的那個換行重繪緩沖區的這個緩沖區,是檔案流指標所有的,對于檔案描述符或者系統呼叫來說是沒有的;
· 檔案流指標中的這個緩沖區被稱為用戶態緩沖區;
2. 重定向原理
- 標準輸出重定向:>> / > , --把原本要寫入標準輸出的資料,寫入到指定檔案中,改變了資料的流向;
- 通過改變檔案描述符這個下標位置所保存的檔案描述資訊,進而改變這個描述符所操作的檔案,實作改變資料的流向;
- 檔案描述符分配規則:最小未使用;
- C默認打開三個檔案 – 標準輸入檔案(stdin)、標準輸出檔案(stdout)、標準錯誤檔案(stderr),對應下標分別為0、1、2,
- dup2 --int dup2(int oldfd, int newfd);
· 讓 newfd 從 oldfd 中拷貝檔案描述資訊地址;把 newfd 重定向到 oldfd 對應的檔案上;




3. 動態庫與靜態庫的生成與使用
1). 鏈接方式
- 動態鏈接:鏈接動態庫,只是在生成的程式中記錄庫中的函式資訊表,并沒有將具體的代碼實作寫入到程式中,因此運行動態鏈接生成的程式時需要依賴動態庫的存在,好處是記憶體中共享一份,
- 靜態鏈接:鏈接靜態庫,在生成的程式中直接將庫中所需函式的實作寫入到可執行程式中,生成的程式比較大,但是沒有依賴性,
2). 庫的生成
- 庫中的函式不能有main函式
- 1.將原始碼經過編譯匯編之后,解釋成為二進制指令;
gcc -c -fPIC testlib.c -o testlib.o - 2.將編譯完成后的二進制指令組織打包成為庫檔案,
· 動態庫:gcc --shared testlib.o … -o libtestlib.so
· 靜態庫:ar -cr libtest.a testlib.o …

3). 庫的使用
- 使用-l選項指定要連接的庫的名稱:gcc main.c -o main -ltestlib
- 但是聯結器在鏈接庫檔案生成可執行程式的時候回到指定的一些路徑下去找庫檔案,找到了就鏈接,找不到就會報錯
- 生成可執行程式時鏈接使用:使用gcc -l選項指定庫名稱 gcc main.c -o main -ltestlib
· 1. 庫檔案放到指定路徑下:/usr/lib64
· 2. 設定環境變數:export LIBRARY_PATH=$LIBRARY_PATH:./
· 3. 使用gcc的-L選項指定庫路徑:gcc main.c -o main -L./ -ltestlib - 運行可執行程式時加載使用:僅針對動態鏈接生成的程式
· 1. 庫檔案放在指定路徑下:/usr/lib64
· 2. 設定環境變數:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/272478.html
標籤:其他
