色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux-基礎IO解析

xCb1_yikoulinux ? 來源:一口Linux ? 作者:一口Linux ? 2022-08-11 11:50 ? 次閱讀

Linux - 基礎 IO

  • Linux - 基礎 IO

  • 文件 IO 相關操作

  • stdin & stdout & stderr

  • 系統文件 I/O

文件的宏觀理解:

狹義理解:

  • 1.文件在磁盤里
  • 2.磁盤是永久性存儲介質,因此文件在磁盤上的存儲是永久性的
  • 3.磁盤是外設(即是輸出設備也是輸入設備)
  • 4.磁盤上的文件 本質是對文件的所有操作,都是對外設的輸入和輸出 簡稱 IO

廣義理解:

  • 1.Linux 下一切皆文件(鍵盤、顯示器、網卡、磁盤…… 這些都是抽象化的過程)

文件操作的歸類認知:

  • 1.對于 0KB 的空文件是占用磁盤空間的
  • 2.文件是文件屬性(元數據)和文件內容的集合(文件 = 屬性(元數據)+ 內容)
  • 3.所有的文件操作本質是文件內容操作和文件屬性操作

系統角度:

  • 1.對文件的操作本質是進程對文件的操作
  • 2.磁盤的管理者是操作系統
  • 3.文件的讀寫本質不是通過 C 語言 / C++ 的庫函數來操作的(這些庫函數只是為用戶提供方便),而是通過文件相關的系統調用接口來實現的

文件 IO 相關操作

8991e790-1928-11ed-ba43-dac502259ad0.png
intfputs(constchar*s,FILE*stream);

fputs 函數是將 s 所指向的數據往 stream 中所指向的文件中寫

89ac4130-1928-11ed-ba43-dac502259ad0.png89bcc2f8-1928-11ed-ba43-dac502259ad0.png

char*fgets(char*str,intnum,FILE*stream)

注:

  • 從流中讀取字符并將它們作為 C 字符串存儲到 str 中,直到讀取 (num-1) 個字符到達換行符或文件結尾以先發生者為準
  • 換行符使 fgets 停止讀取但它被函數視為有效字符并包含在復制到 str 的字符串中。
  • 在復制到 str 的字符之后會自動附加一個終止空字符
  • fgets 與 get 完全不同:fgets 不僅接受流參數,還允許指定 str 的最大大小并在字符串中包含任何結束的換行符。
89cfec02-1928-11ed-ba43-dac502259ad0.png

fwrite 的使用方法

  • 當前路徑指的是每個進程,都有一個內置的屬性 cwd
  • fwrite 函數如果 size_t count 傳入的數正好將字符串內容全部傳入到指定文本中則返回 count,否則返回與 count 不同的數
  • fwrite 函數傳入內容的大小正好是 size_t size, 和 size_t count 的乘積

stdin & stdout & stderr

89e3f1b6-1928-11ed-ba43-dac502259ad0.png
  • 任何 C 程序,都默認打開三個文件分別叫做標準輸入(stdin)、標準輸出(stdout)、標準錯誤(stderr)
  • 標準輸入(stdin)——鍵盤文件——讀方法(read
  • 標準輸出(stdout)、標準錯誤(stderr)——顯示器文件——寫方法(write)
  • Linux 下一切皆文件
  • 所有的外設硬件,本質是對應的核心操作無外乎是 read 和 write(不同的硬件對應的讀寫方式是不一樣的)

89ebbe5a-1928-11ed-ba43-dac502259ad0.png89fdd3a6-1928-11ed-ba43-dac502259ad0.png注:

  • 可以通過 C 接口,直接對 stdin、stdout、stderr 進行讀寫
  • C 默認會打開三個輸入輸出流,分別是 stdin, stdout, stderr, 這樣做便于語言進行上手使用,都有輸入輸出的需求
  • 幾乎所有的編程語言都會默認會打開三個輸入輸出流 stdin, stdout, stderr,
  • 任何一種編程語言的文件操作相關的函數(庫函數)底層都會調用系統調用接口(open、close、write、read,這些在 Linux 系統下有,但這些接口不具備可移植性)
  • 語言上相關文件操作的庫函數兼容自身語法特征,系統調用使用成本較高,而且不具備可移植性

系統文件 I/O

open

#include
#include
#include

intopen(constchar*pathname,intflags);
intopen(constchar*pathname,intflags,mode_tmode);

pathname:要打開或創建的目標文件
flags:打開文件時,可以傳入多個參數選項,用下面的一個或者多個常量進行“或”運算,構成flags。
參數:
O_RDONLY:只讀打開
O_WRONLY:只寫打開
O_RDWR:讀,寫打開
這三個常量,必須指定一個且只能指定一個
 O_CREAT :若文件不存在,則創建它。需要使用mode選項,來指明新文件的訪問權限
O_APPEND:追加寫
返回值:
成功:新打開的文件描述符
失敗:-1

注:

  • open 函數具體使用哪個,和具體應用場景相關,如目標文件不存在,需要 open 創建,則第三個參數表示創建文件的默認權限, 否則,使用兩個參數的 open。
  • O_RDONLY、O_WRONLY、O_RDWR…… 這些都是系統定義的宏,這些參數只占一個 int 整形中的一個比特位

8a0bcd1c-1928-11ed-ba43-dac502259ad0.png

注:write read close lseek…… 與 C 語言文件相關接口用法類似

文件描述符 fd

8a2e8762-1928-11ed-ba43-dac502259ad0.png注:

  • 用戶層看到的 fd 本質是系統中維護進程和文件對應關系的數組的下標
  • 所謂的默認打開文件,標準輸入,標準輸出,標準錯誤,其實是由底層系統支持的,默認一個進程在運行的時候,就打開了 0,1,2
  • 對于進程來講,對所有的文件進行操作,統一使用一套接口(一組函數指針),因此在 OS 看來一切皆文件
8a4b69d6-1928-11ed-ba43-dac502259ad0.png

文件描述符就是從 0 開始的小整數。當打開文件時,操作系統在內存中要創建相應的數據結構來描述目標文件。于是就有了 file 結構體。表示一個已經打開的文件對象。而進程執行 open 系統調用,所以必須讓進程和文件關聯起來。每個進程都有一個指針 files_struct*, 指向一張表 files_struct, 該表最重要的部分就是包涵一個指針數組,每個元素都是一個指向打開文件的指針!所以,本質上,文件描述符就是該數組的下標。只要拿著文件描述符,就可以找到對應的文件

補充:

  • 標準輸入、標準輸出、標準錯誤在對應的文件描述符為 0,1,2,對應 C 語言層上的是 stdin、stdout、stderr
  • 所有文件,如果要被使用時,首先必須被打開
  • 一個進程可以打開多個文件,系統中被打開的文件一定有多個,多個被打開的文件,一定要被操作系統管理起來的(先描述(struct file(包含了目標文件的基本操作和部分屬性)),再組織(雙鏈表))
  • 打開文件的過程:先在 fd_array 數組中找一個最小的沒有被使用的數組下標位置,然后把新 open 出的文件的結構體地址填入到數組中去,對應該地址的下標返回給對應的進程
  • fd:本質是進程和文件之間對應關系的數組的下標,有了 fd 就可以找到打開文件的所有細節

文件描述符的分配規則

8a5bd7bc-1928-11ed-ba43-dac502259ad0.png

總結:

  • 文件描述符的分配規則:在 files_struct 數組當中,找到當前沒有被使用的
    最小的一個下標,作為新的文件描述符
  • Linux 進程默認情況下會有 3 個缺省打開的文件描述符,分別是標準輸入 0, 標準輸出 1, 標準錯誤 2

重定向

8a6e5554-1928-11ed-ba43-dac502259ad0.png8a7d4848-1928-11ed-ba43-dac502259ad0.png

8a91ad38-1928-11ed-ba43-dac502259ad0.png補充:程序替換的時候不會影響重定向對應的數據結構的數據(程序替換影響的是進程虛擬地址空間部分,而重定向影響的是 files_struct 部分)

使用 dup2 系統調用

#include
intdup2(intoldfd,intnewfd);

注:

  • newfd 使 oldfd 的一份拷貝,不是拷貝 fd 而是拷貝 fd 對應的 fd_array 數組中的內容
8a9d2834-1928-11ed-ba43-dac502259ad0.png

FILE

因為 IO 相關函數與系統調用接口對應,并且庫函數封裝系統調用,所以本質上,訪問文件都是通過 fd 訪問的。因此 C 庫當中的 FILE 結構體內部,必定封裝了 fd

typedefstruct_IO_FILEFILE;在/usr/include/stdio.h
在/usr/include/libio.h
struct_IO_FILE{
int_flags;/*High-orderwordis_IO_MAGIC;restisflags.*/
#define_IO_file_flags_flags
//緩沖區相關
/*ThefollowingpointerscorrespondtotheC++streambufprotocol.*/
/*Note:Tkusesthe_IO_read_ptrand_IO_read_endfieldsdirectly.*/
char*_IO_read_ptr;/*Currentreadpointer*/
char*_IO_read_end;/*Endofgetarea.*/
char*_IO_read_base;/*Startofputback+getarea.*/
char*_IO_write_base;/*Startofputarea.*/
char*_IO_write_ptr;/*Currentputpointer.*/
char*_IO_write_end;/*Endofputarea.*/
char*_IO_buf_base;/*Startofreservearea.*/
char*_IO_buf_end;/*Endofreservearea.*/
/*Thefollowingfieldsareusedtosupportbackingupandundo.*/
char*_IO_save_base;/*Pointertostartofnon-currentgetarea.*/
char*_IO_backup_base;/*Pointertofirstvalidcharacterofbackuparea*/
char*_IO_save_end;/*Pointertoendofnon-currentgetarea.*/
struct_IO_marker*_markers;
struct_IO_FILE*_chain;
int_fileno;//封裝的文件描述符
#if0
int_blksize;
#else
int_flags2;
#endif
_IO_off_t_old_offset;/*Thisusedtobe_offsetbutit'stoosmall.*/
#define__HAVE_COLUMN/*temporary*/
/*1+columnnumberofpbase();0isunknown.*/
unsignedshort_cur_column;
signedchar_vtable_offset;
char_shortbuf[1];
/*char*_save_gptr;char*_save_egptr;*/
_IO_lock_t*_lock;
#ifdef_IO_USE_OLD_IO_FILE
};
8ab71e74-1928-11ed-ba43-dac502259ad0.png

總結:

  • FILE 結構體中包含了 int fileno 的成員(也就是系統上的 fd 文件描述符)
  • fopen、fwrite、fread、fclose 等 f 系列的庫函數都是由底層 open、write 、read、close 實現的,通過 open 的返回值傳給 fileno,從而對系統調用函數進行封裝
  • struct FILE 內部包含:
  1. 底層對應的文件描述符下標
  1. 應用層 C 語言提供的緩沖區數據
  • 所謂的默認打開文件,標準輸入、標準輸出、標準錯誤其實是由底層系統支持的,默認一個進程在運行的時候,就打開了 0,1,2
8ac7c800-1928-11ed-ba43-dac502259ad0.png

一般 C 庫函數寫入文件時是全緩沖的,而寫入顯示器是行緩沖。printf fprintf 等庫函數會自帶緩沖區,當發生重定向到普通文件時,數據的緩沖方式由行緩沖變成了全緩沖。而我們放在緩沖區中的數據,就不會被立即刷新,甚至 fork 之后但是進程退出之后,會統一刷新,寫入文件當中。但是 fork 的時候,父子數據會發生寫時拷貝,所以當你父進程準備刷新的時候,子進程也就有了同樣的一份數據,隨即產生兩份數據。write 沒有變化,說明沒有所謂的緩沖
printf fputs 等 庫函數會自帶緩沖區,而 write 系統調用沒有帶緩沖區。另外,我們這里所說的緩沖區,都是用戶級緩沖區。其實為了提升整機性能,OS 也會提供相關內核級緩沖區。printf fprintf 是庫函數, write 是系統調用,庫函數在系統調用的 “上層”, 是對系統調用的 “封裝”,但是 write 有內核級緩沖區,而 printf fwrite fputs 等緩沖區是用戶級緩沖區,由 C 標準庫提供

注:系統調用函數與庫函數盡量不要混在一起使用,可能會與統一使用的函數的運行結果有所差異

文件系統

文件:打開的文件、普通未打開的文件
打開的文件:屬性與操作方法的表現就是 struct file{} 屬于內存級文件
普通未打開的文件:磁盤上面未被加載到內存的
文件系統功能:將上述的這些文件管理起來

8ad80440-1928-11ed-ba43-dac502259ad0.png

磁盤

磁盤是計算機主要的存儲介質,可以存儲大量的二進制數據,并且斷電后也能保持數據不丟失。早期計算機使用的磁盤是軟磁盤(Floppy Disk,簡稱軟盤),如今常用的磁盤是硬磁盤(Hard disk,簡稱硬盤)。

8aeb0176-1928-11ed-ba43-dac502259ad0.png補充:

  • 內存在操作系統的角度使用的時候,基本單位是 4KB,但在使用角度是 1 字節
  • 磁盤存儲的基本單位是扇區(512 字節)(磁盤讀取的最小單元)
  • 內存與磁盤間 IO 時,基本單位是 4KB,是通過文件系統來完成的

磁盤的劃分

我們可以將磁盤想象成磁帶(線性結構),將磁盤看成一個線性空間(數組),類型為扇區的數組、數組個數為 10 億多

8b0f8ca8-1928-11ed-ba43-dac502259ad0.png

這樣劃分就不用讓 OS 讀取數據時在哪個盤面、哪個磁道、哪個扇區找了,OS 與磁盤映射關系可以通過磁盤驅動來完成,這樣也就做到強解耦性。無論換機械硬盤還是固態硬盤,OS 都不用改變讀取磁盤數據的數據結構,只需改變磁盤的驅動程序即可

注:操作系統讀取磁盤數據時的下標——LBA

  • 磁盤經過在 OS 中的虛擬化成數組,但是所占空間太大,因此需要進行分區化管理,并對該區域進行格式化(寫入文件系統(數據和方法))。eg:Windows 中的 C 盤、D 盤……
  • 每個分區再進行分組——塊組
  • Linux 系統下支持多種文件系統:Ext2、Ext3、fs、usb-fs、sysfs、proc

inode

8b2675b2-1928-11ed-ba43-dac502259ad0.png

Linux ext2 文件系統,上圖為磁盤文件系統圖(內核內存映像肯定有所不同),磁盤是典型的塊設備,硬盤分區被劃分為一個個的 block。一個 block 的大小是由格式化的時候確定的,并且不可以更改。例如 mke2fs 的 - b 選項可以設 定 block 大小為 1024、2048 或 4096 字節。而啟動塊(Boot Block)的大小是確定的,

  • Block Group:ext2 文件系統會根據分區的大小劃分為數個 Block Group。而每個 Block Group 都有著相同的結構組成。
  • 超級塊(Super Block):存放文件系統本身的結構信息。記錄的信息主要有:bolck 和 inode 的總量,未使用的 block 和 inode 的數量,一個 block 和 inode 的大小,最近一次掛載的時間,最近一次寫入數據的時間,最近一次檢驗磁盤的時間等其他文件系統的相關信息。Super Block 的信息被破壞,可以說整個文件系統結構就被破壞了
  • GDT,Group Descriptor Table:塊組描述符,描述塊組屬性信息
  • 塊位圖(Block Bitmap):Block Bitmap 中記錄著 Data Block 中哪個數據塊已經被占用,哪個數據塊沒有被占用
  • inode 位圖(inode Bitmap):每個 bit 表示一個 inode 是否空閑可用。
  • i 節點表: 存放文件屬性 如 文件大小,所有者,最近修改時間等
  • 數據區:存放文件內容

注:

  • Block Group 每個塊組中都有,但是 Super Block 并不是每個塊組中都有
  • 每一個文件都對應一個 inode 節點

總結:

  • 基本上,一個文件一個 inode(包括文件)
  • inode 是一個文件的所有的屬性集合(不包含文件名)(空文件也是占據空間的,所有的屬性也是數據也要占據空間)
  • 真正表示文件的不是文件名,而是文件的 inode 編號
  • inode 是可以和特定的數據塊產生關聯的
  • 程序員是通過路徑定位的(目錄)來定位一個文件,而操作系統是通過目錄的 Data blocks 來確定文件名和 inode 的映射關系
  • 目錄是文件,有獨立的 inode 和數據塊

創建一個新文件主要有一下 4 個操作:

  • 1.存儲屬性 ——內核先找到一個空閑的 i 節點。內核把文件信息記錄到其中。
  • 2.存儲數據 ——該文件需要存儲在三個磁盤塊,內核找到了三個空閑塊。將內核緩沖區數據緩沖到磁盤的數據區中
  • 3.記錄分配情況——文件內容按順序存放(數據塊)。內核在 inode 上的磁盤分布區記錄了上述塊列表。
  • 4.添加文件名到目錄——內核將入口添加到目錄文件。文件名和 inode 之間的對應關系將文件名和文件的內容及屬性連接起來。

大多是操作系統在同一個目錄下是不允許存在同名文件的 刪除文件不需要清空該文件占據的所有的空間數據(只需將該文件的 inode 和對應的數據塊無效化即可(文件對應 inode 和 Block 位圖中的數字 1 設置為 0,并將該文件所對應的目錄中的數據塊的關于該文件內容清空即可) Linux 下屬性和內容是分離的,屬性 inode 保存的(在同一塊塊組 inode 編號是不同的,但是跨組的 inode 編號可能相同),內容 Data blocks 保存的

補充:

  • inode 描述了文件大小和指向數據塊的指針
  • 通過 inode 可獲得文件占用的塊數
  • 通過 inode 可實現文件的邏輯結構和物理結構的轉換

軟硬連接

硬鏈接:
8b37da14-1928-11ed-ba43-dac502259ad0.png硬鏈接的應用場景:方便進行相對路徑的路徑的設置
8b4bc664-1928-11ed-ba43-dac502259ad0.png

8b6283ea-1928-11ed-ba43-dac502259ad0.png因此,可以看出.、… 的底層實現是通過硬鏈接的方式來實現的
注:

  • 真正找到磁盤上文件的并不是文件名,而是 inode。其實在 linux 中可以讓多個文件名對應于同一個 inode
  • 在刪除文件時干了兩件事情:1. 在目錄中將對應的記錄刪除,2. 將硬連接數 - 1,如果為 0,則將對應的磁盤釋放。

軟鏈接:
8b6e8c3a-1928-11ed-ba43-dac502259ad0.png注:硬鏈接是通過 inode 引用另外一個文件,軟鏈接是通過名字引用另外一個文件

總結:軟硬鏈接的區別:本質是是否是獨立文件,有無獨立 inode;用途:軟鏈接可以指向特定的文件方便進行快速索引,硬鏈接是能進行相對路徑設置

補充:

  • 軟鏈接文件是一個獨立的文件有自己的 inode 節點,通過數據中保存的源文件路徑訪問源文件
  • 硬鏈接是文件的一個目錄項,與源文件共用同一個 inode 節點,直接通過自己的 inode 節點訪問源文件
  • 不同分區有可能有不同文件系統,因此硬鏈接不能跨分區建立;軟連接可以跨文件系統進行連接,硬鏈接不可以
  • 當刪除源文件時,軟鏈接文件失效
  • ln 生成符號鏈接文件指的是 ln -s 生成軟鏈接文件

文件的 ACM

8b937bd0-1928-11ed-ba43-dac502259ad0.png8ba98b50-1928-11ed-ba43-dac502259ad0.png

總結:

  • Access 最后訪問時間
  • Modify 文件內容最后修改時間
  • Change 屬性最后修改時間

文件的 ACM 的應用場景:
8bd59240-1928-11ed-ba43-dac502259ad0.png

動態庫和靜態庫

靜態庫與動態庫

  • 使用頂尖的工程師寫的代碼是為了開發效率和魯棒性(健壯性)
  • 使用頂尖的工程師寫的功能一般通過庫、開源代碼、基本的網絡功能調用(各種網絡接口、語音識別
  • 庫分為動態庫和靜態庫
  • 庫的命名:取消前綴 lib,去掉. 之后的內容,剩下的就是庫的名字
  • 生成可執行程序的方式有兩種:動態鏈接、靜態鏈接

8c043168-1928-11ed-ba43-dac502259ad0.png注:

  • ldd 可以列出一個程序所需要得動態鏈接庫;file 命令用于辨識文件類型
  • Linux 中,默認情況下形成的可執行程序是動態鏈接的
  • 將庫中的我的可執行程序中使用的二進制代碼,拷貝進我的可執行程序中——靜態鏈接
  • 一般為了更好的支持開發,第三方庫或者語言庫都必須提供兩個庫,一個叫做靜態庫,一個叫做動態庫,方便程序員根據需要進行可執行程序的生成
  • 動態鏈接的特點:體積小、節省資源(磁盤、內存),依賴庫,一旦丟失可執行程序不可執行
  • 靜態鏈接的特點:體積大、浪費資源(磁盤、內存),不依賴庫,庫丟失,可執行程序不受影響

總結:

  • 靜態庫(.a):程序在編譯鏈接的時候把庫的代碼鏈接到可執行文件中。程序運行的時候將不再需要靜態庫
  • 動態庫(.so):程序在運行的時候才去鏈接動態庫的代碼,多個程序共享使用庫的代碼。
  • 一個與動態庫鏈接的可執行文件僅僅包含它用到的函數入口地址的一個表,而不是外部函數所在目標文件的整個機器碼
  • 在可執行文件開始運行以前,外部函數的機器碼由操作系統從磁盤上的該動態庫中復制到內存中,這個過程稱為動態鏈接(dynamic linking)
  • 動態庫可以在多個程序間共享,所以動態鏈接使得可執行文件更小,節省了磁盤空間。操作系統采用虛擬內存機制允許物理內存中的一份動態庫被要用到該庫的所有進程共用,節省了內存和磁盤空間

生成靜態庫

[root@localhostlinux]#ls
add.cadd.hmain.csub.csub.h
[root@localhostlinux]#gcc-cadd.c-oadd.o
[root@localhostlinux]#gcc-csub.c-osub.o
生成靜態庫
[root@localhostlinux]#ar-rclibmymath.aadd.osub.o
ar是gnu歸檔工具,rc表示(replaceandcreate)
查看靜態庫中的目錄列表
[root@localhostlinux]#ar-tvlibmymath.a
rw-r--r--0/01240Sep1516:532017add.o
rw-r--r--0/01240Sep1516:532017sub.o
t:列出靜態庫中的文件
v:verbose詳細信息
[root@localhostlinux]#gccmain.c-I-L.-lmymath
-L指定庫路徑
-I指定頭文件路徑
-l指定庫名
測試目標文件生成后,靜態庫刪掉,程序照樣可以運行
8c174a50-1928-11ed-ba43-dac502259ad0.png

注:

  • -I:告訴 gcc 除了默認路徑(/usr/include)以及當前路徑之外,在指定路徑下也找一下頭文件
  • -L:告訴 gcc 除了默認路徑 (/lib/ 、/lib64 、/lib64/libc*) 以及當前路徑之外,在指定路徑下也找一下庫文件
  • -l庫名稱:具體鏈接哪個庫

C 語言編譯時直接編譯不用任何選項:

  • 1.庫文件和頭文件在默認路徑下 gcc 能找到
  • 2.gcc 編譯 C 語言代碼默認應該鏈接 libc

當自己的可執行程序編譯時不想用這些選項:將頭文件和庫文件分別拷貝到默認路徑下——庫的安裝(第三方庫)(使用時必須帶上 - l 庫名稱) 當只有靜態庫時,沒有動態庫,用 gcc 編譯(不加 - static)會直接用靜態鏈接生成可執行程序

補充:

  • 庫搜索路徑:
  • 從左到右搜索 - L 指定的目錄。
  • 由環境變量指定的目錄 (LIBRARY_PATH)
  • 由系統指定的目錄
    /usr/lib
    /usr/local/lib

生成動態庫

  • shared: 表示生成共享庫格式
  • fPIC:產生位置無關碼 (position independent code)
  • 庫名規則:libxxx.so
    8c49f248-1928-11ed-ba43-dac502259ad0.png

補充:

  • 動態庫被加載在內存中,可以供多個使用庫的程序共享映射到自己的虛擬地址空間使用,因此可以減少頁面交換以及降低內存中代碼冗余,并且因為與源程序模塊分離,因此開發模式比較好
  • 加載動態庫的程序運行速度相對較慢,因為動態庫運行時加載,映射到虛擬地址空間后需要重新根據映射起始地址計算函數 / 變量地址
  • 靜態庫會被添加為程序的一部分進行使用
  • 動態庫可用節省內存和磁盤空間
  • 靜態庫重新編譯,需要將應用程序重新編譯

運行動態庫

1.拷貝. so 文件到系統共享庫路徑下, 一般指 / usr/lib

2.更改 LD_LIBRARY_PATH(當系統重啟時使用之前添加的是無效的,應重新添加)

exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:路徑

3.ldconfig 配置 / etc/ld.so.conf.d/,ldconfig 更新

8c681c96-1928-11ed-ba43-dac502259ad0.png

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11294

    瀏覽量

    209341
  • 磁盤
    +關注

    關注

    1

    文章

    375

    瀏覽量

    25201
  • C++
    C++
    +關注

    關注

    22

    文章

    2108

    瀏覽量

    73623
收藏 人收藏

    評論

    相關推薦

    λ-IO:存儲計算下的IO棧設計

    動機和背景? ? 存儲計算存儲資源的充分利用。IO棧是管理存儲器的的基本組件,包括設備驅動、塊接口層、文件系統,目前一些用戶空間IO庫(如SPDK)有效降低了延遲,但是io棧仍然不可或缺。這是因為1
    的頭像 發表于 12-02 10:35 ?195次閱讀
    λ-<b class='flag-5'>IO</b>:存儲計算下的<b class='flag-5'>IO</b>棧設計

    迅為RK3568開發板定制擴展分區SDK源碼編譯-獲取Linux-定制擴展分區源碼包

    獲取 Linux-定制擴展分區源碼包 編譯環境說明: 現在的 SDK 源碼在編譯的時候會自動配置編譯環境,所以對環境要求不再那么嚴格,經過測試,本源碼可以在 ubuntu20、ubuntu22
    發表于 11-25 10:24

    一文解讀Linux 5種IO模型

    Linux里有五種IO模型:阻塞IO、非阻塞IO、多路復用IO、信號驅動式IO和異步
    的頭像 發表于 11-09 11:12 ?308次閱讀
    一文解讀<b class='flag-5'>Linux</b> 5種<b class='flag-5'>IO</b>模型

    望獲實時Linux-虛擬化PLC解決方案

    行業趨勢:IT與OT的深度融合 虛擬化PLC的優勢:靈活與高效的結合 望獲實時Linux的優勢:強實時和強大的行業中間件支持 實時性:系統響應延遲<10us,支持EtherCAT-125us周期同步
    的頭像 發表于 11-08 10:28 ?166次閱讀
    望獲實時<b class='flag-5'>Linux-</b>虛擬化PLC解決方案

    Linux--IO多路復用(select,poll,epoll)

    IO多路復用——select,poll,epollIO多路復用是一種操作系統技術,旨在提高系統處理多個輸入輸出操作的性能和資源利用率。與傳統的多線程或多進程模型相比,IO多路復用避免了因阻塞IO
    的頭像 發表于 11-06 16:13 ?263次閱讀

    Linux系統中shell命令解析

    shell是Linux系統的用戶界面,提供了用戶與內核交互的一種接口,它接收用戶輸入的命令并到送到內核去執行,因此也被稱為Linux的命令解釋器。
    的頭像 發表于 11-05 15:40 ?223次閱讀

    華納云監視Linux磁盤IO性能命令:iotop,iostat,vmstat,atop,dstat,ioping

    以下介紹6個監視 Linux 磁盤IO性能的命令(工具),它們分別是iotop、iostat、vmstat、atop、dstat、ioping,以下將附上簡單的使用方法。 前言 磁盤IO
    的頭像 發表于 10-24 14:43 ?169次閱讀

    MR20遠程IOIO-Link的差異化應用

    將為您深入解析明達技術自主研發的MR20一體式遠程IOIO-Link的區別,幫助您更好地理解和選擇適合您需求的通信方案。
    的頭像 發表于 10-21 17:29 ?199次閱讀

    IO-Link的定義和特點

    IO-Link是一種用于工業自動化領域的數字通信協議和接口標準,它允許傳感器、執行器和其他工業設備與控制器(如PLC等)之間進行雙向通信,以實現實時數據傳輸和控制信號交換。以下是對IO-Link的詳細解析,包括其定義、特點、原理
    的頭像 發表于 10-08 11:23 ?865次閱讀

    解析一體式IO與分布式IO:從架構到應用

    在工業自動化領域,IO(輸入/輸出)系統扮演著舉足輕重的角色。它們不僅負責數據的采集和控制指令的發送,還直接影響到系統的靈活性、可靠性和成本效益。明達技術將為您介紹一體式IO和分布式IO在架構及應用層的主要區別,幫助您更好地理解
    的頭像 發表于 10-08 10:02 ?242次閱讀
    <b class='flag-5'>解析</b>一體式<b class='flag-5'>IO</b>與分布式<b class='flag-5'>IO</b>:從架構到應用

    Linux磁盤IO詳細解析

      在講解磁盤IO前,先簡單說下什么是磁盤。磁盤是可以持久化存儲的設備,根據存儲介質的不同,常見磁盤可以分為兩類:機械磁盤和固態磁盤。
    的頭像 發表于 08-05 15:49 ?608次閱讀
    <b class='flag-5'>Linux</b>磁盤<b class='flag-5'>IO</b>詳細<b class='flag-5'>解析</b>

    ElfBoard技術貼|在NXP源碼基礎上適配ELF 1開發板的按鍵功能

    ,將以按鍵功能的適配作為具體示例,深入解析整個適配的流程。一、準備工作NXP源碼路徑:ELF1開發板資料包\07-NXP原廠資料\07-1NXP官方源碼\linux-
    的頭像 發表于 07-10 09:54 ?595次閱讀
    ElfBoard技術貼|在NXP源碼基礎上適配ELF 1開發板的按鍵功能

    遠程IO與分布式IO的區別

    在工業自動化和控制系統設計中,遠程IO(Input/Output)和分布式IO是兩個重要的概念。它們各自具有獨特的特點和優勢,適用于不同的應用場景。本文將詳細探討遠程IO與分布式IO
    的頭像 發表于 06-15 15:57 ?2498次閱讀

    虹科技術丨一文詳解IO-Link Wireless技術如何影響工業無線自動化

    在工業無線自動化的飛速發展進程中,IO-Link Wireless技術成為了一項具有顛覆性的創新。它將IO-Link協議與無線連接完美結合,解決了傳統通信技術在工業應用中的痛點。本文將深入解析
    的頭像 發表于 02-02 09:52 ?445次閱讀
    虹科技術丨一文詳解<b class='flag-5'>IO</b>-Link Wireless技術如何影響工業無線自動化

    Linux查看IO狀態的常用命令都有哪些呢?

    介紹下Linux的3個常用I/O相關命令,解決I/O壓力過大問題時用iostat,查看磁盤的I/O狀態用iotop,查看I/O進程排名用lsof
    的頭像 發表于 01-16 09:28 ?5372次閱讀
    主站蜘蛛池模板: 99久久国内精品成人免费| 精品国产福利一区二区在线| 女性酥酥影院| 张津瑜的9分58秒7段免费| 国产在线不卡| 午夜理论电影在线观看亚洲| 吃奶吸咪咪动态图| 青柠电影在线看| CHINSEFUCKGAY无套| 秘密教学93话恩爱久等了免费 | 最近韩国HD免费观看国语| 精子pk美女| 野花韩国高清完整版在线观看5| 国产专区_爽死777| 亚洲、国产综合视频| 国产精品一区二区在线观看 | 久久中文字幕免费高清| 国产亚洲精品首页在线播放| 婷婷综合亚洲爱久久| 国产成人久久AV免费看澳门| 涩涩网站在线看| 国产 浪潮AV性色四虎| 色欲AV精品一区二区入口| 荡乳乱公小说| 色欲精品国产AV久久久| 国产1000部成人免费视频| 少妇内射视频播放舔大片| 国产白丝精品爽爽久久久久久蜜臀 | 久久女婷五月综合色啪| 永久免费的污视频网站| 精品无码一区二区三区中文字幕| 亚洲无遮挡| 精品免费久久久久久影院| 一级毛片全部免| 国产在线中文字幕| 97国产蝌蚪视频在线观看| 久久这里有精品| 2019久久视频这里有精品15| 欧美高清69hd| 99热在线视频| 亚洲精品久久久无码AV片软件|