作業系統 庫

2021-09-25 15:04:43 字數 1786 閱讀 3507

庫的定義:

庫就是目標檔案的集合,我們把不需要公升級更新維護的**打包合併在一起方便使用,也可以對源**進行保密。

靜態庫:

靜態庫在使用時在使用時是把被呼叫的**複製到呼叫模組中,然後在執行程式時,靜態庫就不需要了。

靜態庫的特性:

靜態的擴充套件名為.a

靜態庫的執行速度快,但占用記憶體大,當庫中的內容發生變化時,需要重新編譯出新的程式,因此不能輕易修改庫中的內容

共享庫:

共享庫(動態庫)的副檔名.so

而共享只是在呼叫模組中嵌入呼叫**的在庫的相對位置的位址,當執行程式時,共享庫的程式會一起載入到記憶體中,

當執行到呼叫共享庫中**的指令時跳轉到共享中使用,執行完畢後在跳轉回來。

共享庫的特性:

占用空間小,方便更新(共享庫發生變化,程式不需要再次編譯),相對於靜態庫執行效率略低。

靜態庫如何建立並使用:

1.建立靜態庫

編寫源**: vi .c/.h

編譯源**: gcc -c ***.c -> ***.o

打包生成靜態庫: ar -r lib***.a x1.o x2.o …

ar命令的一些引數:

-r 把目標檔案新增到靜態庫中,已經存在的更新

-q 把目標檔案追加到靜態庫的末尾

-d 從靜態庫中刪除目標檔案

-t 顯示靜態庫中有哪些檔案

-x 把靜態庫拆分成目標檔案

2.呼叫靜態庫動態庫如何建立並使用:

1.建立共享庫

編寫源**: vi .c/.h

編譯出位置無關目標檔案

gcc -c -fpic ***.c -> ***.o

鏈結生成共享庫:

gcc -shared x1.o x2.o x3.o … -o lib***.so

2.呼叫共享庫

直接呼叫:呼叫者和庫要在同一路徑下

gcc main.c lib***.so

在使用共享庫時,呼叫者只是記錄了**在庫的位置,因此在執行時需要共享庫同時被載入。

作業系統會根據ld_library_path環境變數的設定來載入共享庫。

動態載入共享庫

標頭檔案: #include

1.載入共享庫

void *dlopen(const char *filename, int flag);

filename: 共享庫的庫名,或路徑。

flag: 載入方式。

rtld_lazy 使用時才載入

rtld_now 立即載入

返回值:共享庫的控制代碼(類似檔案指標)

2.獲取識別符號位址

void *dlsym(void *handle, const char *symbol);

handle:共享庫的控制代碼

symbol:識別符號的名字

返回值:識別符號在共享庫中的位置(位址,可以解引用,或跳轉過去)

3.解除安裝共享庫

int dlclose(void *handle);

handle:共享庫的控制代碼

返回值: 成功返回0;

失敗返回-1;

4.獲取錯誤資訊

char *dlerror(void);

返回值:會把在使用共享庫的過程**現的錯誤,以字串形式返回

lua os 作業系統 庫

lua os庫提供了簡單的跟作業系統有關的功能 os.clock 返回當前當前cpu使用的秒數 用來計算中間的遍歷花費了多少cpu時間 local x os.clock local s 0 for i 1,10000000 do s s i end print string.format elaps...

作業系統 作業系統介面

介面表現為函式呼叫,由作業系統提供,連線作業系統和應用軟體。出於安全性考慮,應用程式不能直接在記憶體中任意訪問 將核心程式和使用者程式隔離 通過比較訪問資料段cpl和rpl的特權級和當前段dpl的特權級之間的關係 應用程式呼叫庫函式printf printf呼叫庫中的write函式 write將函式...

作業系統(作業系統引論)

方便性 方便使用者進行操作計算機 有效性提高系統資源的利用率 提高系統的吞吐量,加速程式的執行 可擴充性 方便地增添新的模組和功能,以及對原有的功能模組進行修改 開放性能夠遵循世界標準規範 os作為使用者和計算機硬體系統之間的介面 使用者能夠通過作業系統來使用計算機系統 os作為計算機資源的管理者 ...