国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用!(緩沖區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù))

這篇具有很好參考價(jià)值的文章主要介紹了[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用?。ň彌_區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù))。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

? ? ? ? hello,大家好,這里是bang___bang_,今天來(lái)談?wù)劦奈募到y(tǒng)知識(shí),包含有緩沖區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)。本篇旨在分享記錄知識(shí),如有需要,希望能有所幫助。

[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用?。ň彌_區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤

[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用?。ň彌_區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤

目錄

1??緩沖區(qū)

??緩沖區(qū)的意義

??常見(jiàn)緩沖區(qū)刷新策略

??緩沖區(qū)位置猜想

??現(xiàn)象猜測(cè)

??現(xiàn)象解釋

??用戶級(jí)緩沖區(qū)位置

2??理解文件系統(tǒng)

??磁盤的存儲(chǔ)結(jié)構(gòu)

??磁盤物理結(jié)構(gòu)

??磁盤抽象結(jié)構(gòu)

??文件系統(tǒng)

??inode vs 文件名

3??軟硬鏈接

??軟鏈接

??硬鏈接

4??動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)

??靜態(tài)庫(kù)

??生成靜態(tài)庫(kù)

??使用靜態(tài)庫(kù)

??動(dòng)態(tài)庫(kù)

??生成動(dòng)態(tài)庫(kù)

??使用動(dòng)態(tài)庫(kù)

??同時(shí)存在使用靜態(tài)庫(kù)還是動(dòng)態(tài)庫(kù)?

??特點(diǎn)總結(jié)

??靜態(tài)庫(kù)特點(diǎn)

??動(dòng)態(tài)庫(kù)特點(diǎn)


1??緩沖區(qū)

問(wèn)題:什么是緩沖區(qū)?

答:就是一段內(nèi)存空間??!

??緩沖區(qū)的意義

我們知道了一段內(nèi)存空間就是緩沖區(qū),那么為什么要有緩沖區(qū)呢?

??生活例子映射:

????????你在西安,你有個(gè)好朋友在上海,下個(gè)月好朋友要過(guò)生日了,你想送他一本你自己手繪的圖畫,你可以選擇自己騎車親手送給你的朋友;也可以選擇下樓到順豐選擇寄送包裹然后回家。

毫無(wú)疑問(wèn):你自己騎車親手送需要花費(fèi)大量的時(shí)間,而你選擇去順豐寄包裹卻很快,但是寄包裹也不是立馬就會(huì)發(fā)送包裹,可能要等倉(cāng)庫(kù)堆滿一批貨物再一起發(fā)送。(圖畫是數(shù)據(jù),順豐是緩沖區(qū))

自己騎車親手送就相當(dāng)于寫透模式(WT)

而去順豐寄包裹再可以直接回家就相當(dāng)于寫回模式(WB)

寫透模式:直接將數(shù)據(jù)寫到外部設(shè)備。

寫回模式:先將數(shù)據(jù)寫到緩沖區(qū),當(dāng)緩沖區(qū)的數(shù)據(jù)達(dá)到一定量時(shí),再集中寫到外部設(shè)備。

通過(guò)這個(gè)例子很顯然能感受到緩沖區(qū)存在的意義了!

緩沖區(qū)存的意義:提高整機(jī)效率。主要是為了提高用戶的響應(yīng)速度!

??常見(jiàn)緩沖區(qū)刷新策略

緩沖策略=一般+特殊?

一般情況:?

?????????立即刷新

?????????行刷新(行緩沖)

?????????滿刷新(全緩沖)

特殊情況:

?????????用戶強(qiáng)制刷新(fflush)? ?

?????????進(jìn)程退出? ?

一般而言:行緩沖的設(shè)備文件——顯示器? ? ? ? ? ? ? 全緩沖的設(shè)備文件——磁盤文件

????????所有的設(shè)備,永遠(yuǎn)都傾向于全緩沖!

——緩沖區(qū)滿了,才刷新—>更少次的IO操作—>更少次的外設(shè)的訪問(wèn)(提高效率)? ??

????????和外部設(shè)備IO的時(shí)候,數(shù)據(jù)量的大小不是主要矛盾,和外設(shè)預(yù)備IO的過(guò)程是最耗費(fèi)時(shí)間的!!

??緩沖區(qū)位置猜想

??現(xiàn)象猜測(cè)

??下面有一段代碼,我們分別輸出到顯示屏,輸出重定向到文件。

int main() {
    //C語(yǔ)言提供的
    printf("hello printf\n");
    fprintf(stdout, "hello fprintf\n");
    const char* s = "hello fputs\n";
    fputs(s, stdout);

    //OS提供的
    const char* ss = "hello write\n";
    write(1, ss, strlen(ss));

    fork();

    return 0;
}
[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用?。ň彌_區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤
現(xiàn)象圖

????????我們可以看到同一份代碼,輸出的結(jié)果卻不一樣,C的IO接口打印了2次,系統(tǒng)接口只打印1次和向顯示器打印一樣!也就是說(shuō)子進(jìn)程中有父進(jìn)程C的IO接口對(duì)應(yīng)的打印數(shù)據(jù),但沒(méi)有系統(tǒng)接口的。也就是說(shuō)如果有緩沖區(qū),那么絕對(duì)是C標(biāo)準(zhǔn)庫(kù)來(lái)提供的。

[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用?。ň彌_區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤

??現(xiàn)象解釋

????????★如果向顯示器打印,刷新策略是行刷新,那么進(jìn)程執(zhí)行到fork()函數(shù)時(shí)會(huì)將C標(biāo)準(zhǔn)庫(kù)里緩沖區(qū)的數(shù)據(jù)全部進(jìn)行刷新出去(fork無(wú)意義?。?/p>

????????對(duì)于進(jìn)程來(lái)說(shuō),當(dāng)我們調(diào)用C文件接口fputs時(shí),實(shí)際是將進(jìn)程數(shù)據(jù)寫入到C標(biāo)準(zhǔn)庫(kù)中的緩沖區(qū)里,然后再統(tǒng)一調(diào)用系統(tǒng)接口write函數(shù)寫入到對(duì)應(yīng)的目標(biāo)文件中。?

[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用!(緩沖區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤

????????如果我們進(jìn)行輸出重定向時(shí),將原本寫入到stdout文件中的數(shù)據(jù)寫入到了磁盤文件中,緩沖模式就由行刷新變成了全緩沖。(\n便沒(méi)有意義了?。?/span>當(dāng)進(jìn)程執(zhí)行到代碼fork()時(shí),此時(shí)進(jìn)程寫入C標(biāo)準(zhǔn)庫(kù)中的緩沖區(qū)數(shù)據(jù)還未刷新。當(dāng)進(jìn)程執(zhí)行fork函數(shù),便又生成了子進(jìn)程。

????????fork后父子進(jìn)程退出:刷新數(shù)據(jù)到磁盤文件中,但是刷新實(shí)際上也是一次寫入,因?yàn)檫M(jìn)程的獨(dú)立性,發(fā)生寫時(shí)拷貝,打印2份?。?/p>

????????★緩沖區(qū)里的數(shù)據(jù)也是父進(jìn)程的數(shù)據(jù)!提前強(qiáng)制刷新后,沒(méi)有數(shù)據(jù)了,子進(jìn)程也就沒(méi)拷貝了!

[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用?。ň彌_區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤

??用戶級(jí)緩沖區(qū)位置

問(wèn)題:為什么fflush只傳了stdout,卻能找到緩沖區(qū)?

答:C語(yǔ)言中,打開(kāi)文件,F(xiàn)ILE* fopen(),struct FILE 結(jié)構(gòu)體 內(nèi)部封裝了fd,還包含了該文件fd對(duì)應(yīng)的語(yǔ)言層的緩沖區(qū)結(jié)構(gòu)!

[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用!(緩沖區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤

2??理解文件系統(tǒng)

??我們使用ls -l指令讀取文件信息,實(shí)際上是對(duì)磁盤中的文件進(jìn)行讀取。

[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用?。ň彌_區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤

磁盤——永久性存儲(chǔ)介質(zhì)(還有SSD,U盤,flash卡,光盤,磁帶)?

磁盤是一個(gè)外設(shè)+還是我們計(jì)算機(jī)中唯一的一個(gè)機(jī)械設(shè)備!也就是說(shuō)速度很慢?。ㄏ鄬?duì)于CPU)

??磁盤的存儲(chǔ)結(jié)構(gòu)

??磁盤物理結(jié)構(gòu)

磁盤盤片,磁頭,伺服系統(tǒng),音圈馬達(dá)等等

[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用?。ň彌_區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤

向磁盤寫入,本質(zhì)就是改變磁盤上的正負(fù)性。

[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用?。ň彌_區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤

磁盤的盤面被劃分為一個(gè)個(gè)磁道,而磁道又被劃分為一個(gè)個(gè)扇區(qū)。

扇區(qū)(磁道劃分區(qū)域)是磁盤存儲(chǔ)數(shù)據(jù)的基本單位(512byte)

如何將數(shù)據(jù)寫入指定的一個(gè)扇區(qū)?有以下步驟:CHS尋址

? ? ——1.在哪一個(gè)面上(對(duì)應(yīng)的就是哪一個(gè)磁頭)

? ? ——2.在哪一個(gè)磁道(柱面)上

? ? ——3.在哪一個(gè)扇區(qū)上

如果我們有了CHS尋址方式,就可以找到任意一個(gè)扇區(qū)。

??磁盤抽象結(jié)構(gòu)

小時(shí)候我們都有過(guò)磁帶這種東西,他是纏在一起成圈的,但是我們也可以將他全拉出來(lái)成線狀。磁盤我們也可以抽象成拉長(zhǎng)后變?yōu)榫€狀結(jié)構(gòu)。

結(jié)構(gòu):圓形結(jié)構(gòu)(CHS)->線性結(jié)構(gòu)(LBA)

LBA是非常單純的一種尋址模式﹔從0開(kāi)始編號(hào)來(lái)定位扇區(qū),第一扇區(qū)LBA=0,第二扇區(qū)LBA=1,依此類推。所以將來(lái)我們想要訪問(wèn)磁盤的某個(gè)扇區(qū),只需要將通過(guò)LBA尋址后轉(zhuǎn)換為CHS物理尋址。

[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用!(緩沖區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤

最終:對(duì)磁盤的管理就變成了對(duì)一個(gè)個(gè)小分區(qū)的管理。?

??文件系統(tǒng)

[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用!(緩沖區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤
磁盤文件系統(tǒng)圖
上圖為磁盤文件系統(tǒng)圖(內(nèi)核內(nèi)存映像肯定有所不同), 磁盤是典型的塊設(shè)備 ,硬盤分區(qū)被
劃分為一個(gè)個(gè)的 block 。一個(gè) block 的大小是由格式化的時(shí)候確定的,并且不可以更改。

雖然磁盤的基本單位是扇區(qū)(512字節(jié)),但是OS(文件系統(tǒng))和磁盤進(jìn)行IO的基本單位是:4KB(8*512byte)4KB->block大小

????????★Super Block->文件系統(tǒng)的屬性信息

????????★Data bolcks->多個(gè)4KB大小的集合,保存的都是特定文件的內(nèi)容

????????★inode Table:inode是一個(gè)大小為128字節(jié)的空間,保存的是對(duì)應(yīng)文件的屬性該塊組內(nèi),所有文件的inode空間的集合,需要標(biāo)識(shí)唯一性,每一個(gè)inode塊,都要有一個(gè)inode編號(hào)!

????????★Block Bitmap:假設(shè)有10000+blocks,10000+比特位;比特位合特定的block是一一對(duì)應(yīng)的,其中比特位為1,代表該block被占用,否則表示可用!

????????★inode Bitmap:假設(shè)有10000+個(gè)inode節(jié)點(diǎn),就有10000+個(gè)比特位,比特位和特定的inode是一一對(duì)應(yīng)的。其中bitmap中比特位為1,代表該inode被占用,否則表示可用!

????????★GDT:塊組描述符,這個(gè)塊組多大,已經(jīng)使用了多少了,有多少個(gè)inode,已經(jīng)占用了多少個(gè),還剩多少,一共有多少個(gè)block,使用了多少....

我們將塊組分割成上面的內(nèi)容,并且寫入相關(guān)的管理數(shù)據(jù)->每一個(gè)塊組都這么干->整個(gè)分區(qū)就被寫入了文件系統(tǒng)信息?。。。ǜ袷交?/span>

??inode vs 文件名

  • 一個(gè)目錄下,可以保存很多文件,但是這些文件都不會(huì)重名。
  • 目錄是文件,目錄有自己的inode和Data block

????????文件名在目錄的Data block 中,它保存著與inode編號(hào)的映射關(guān)系,文件名與inode互為key值,都是唯一的。

??為什么目錄需要w權(quán)限?

因?yàn)樵谀夸浵聞?chuàng)建文件時(shí),這個(gè)目錄有自己的數(shù)據(jù)塊,我們創(chuàng)建文件的文件名就在目錄的Data block 中,所以我們要將文件名和inode編號(hào)寫入保存,此時(shí)必須需要w權(quán)限。

??為什么目錄中具有r權(quán)限?

當(dāng)我們需要顯示文件名時(shí),我們只能從目錄的內(nèi)容中獲取文件名及相關(guān)屬性,就必須訪問(wèn)目錄的文件內(nèi)容,就必須需要r權(quán)限從目錄的Data block中獲取文件名。?

??創(chuàng)建文件,系統(tǒng)做了什么?

特定分組找到?jīng)]有使用的inode,分配inode編號(hào),如果文件有內(nèi)容,向文件內(nèi)容當(dāng)中申請(qǐng)Data Block,設(shè)置Block Bitmap,建立inode和Bitmap的映射,inode和Bitmap、Data Block的對(duì)應(yīng)關(guān)系并寫到inode結(jié)點(diǎn)中,inode文件名對(duì)應(yīng)的映射關(guān)系寫到特定的目錄的DataBlock中。

??刪除文件,系統(tǒng)做了什么?

刪除文件肯定是在這個(gè)目錄下刪除,找到這個(gè)目錄的Data Block, 刪文件用戶提供文件名,在Data Block中索引查詢由文件名進(jìn)行映射的inode編號(hào),找到將inodeBitmap對(duì)應(yīng)的比特位由1置為0,將Block Bitmap中的比特位由1置為0,在目錄的Data Blocks中將文件名與inode編號(hào)解除映射關(guān)系。

??查看文件,系統(tǒng)做了什么?

根據(jù)文件名找到inode,然后查內(nèi)容查屬性。

3??軟硬鏈接

本質(zhì)區(qū)別:有沒(méi)有獨(dú)立的inode

??軟鏈接

軟鏈接有獨(dú)立的inode,軟鏈接是一個(gè)獨(dú)立的文件

應(yīng)用:相當(dāng)于windows下的快捷方式

特性:可以理解成為:軟鏈接的文件內(nèi)容,是指向的文件對(duì)應(yīng)的路徑!

ln -s 文件 軟鏈接文件名

??建立一個(gè)軟鏈接

[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用?。ň彌_區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤

???軟鏈接如同Windows下的快捷方式

[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用?。ň彌_區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤

??硬鏈接

硬鏈接沒(méi)有獨(dú)立的inode,硬鏈接不是一個(gè)獨(dú)立的文件(有被鏈接文件的inode)

創(chuàng)建硬鏈接就是在指定的目錄下,建立了 文件名 和 指定inode的映射關(guān)系。

ln 文件 硬鏈接文件名

??建立一個(gè)硬鏈接

[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用?。ň彌_區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤

硬鏈接沒(méi)有獨(dú)立的inode!也就是說(shuō)硬鏈接不是一個(gè)獨(dú)立的文件!

??硬鏈接數(shù)(引用計(jì)數(shù))

[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用?。ň彌_區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤

硬鏈接后inode與文件名映射關(guān)系增加1組,所以為2,從這里可以看出一個(gè)思想:

當(dāng)我們刪除一個(gè)文件的時(shí)候,并不是把這個(gè)文件inode刪除,而是將這個(gè)文件的inode引用計(jì)數(shù)--。當(dāng)引用計(jì)數(shù)為0的時(shí)候,這個(gè)文件,才正在刪除!?。≧AII思想)

??默認(rèn)創(chuàng)建文件引用計(jì)數(shù)是1,創(chuàng)建目錄引用計(jì)數(shù)是2

[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用!(緩沖區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤

inode與文件名對(duì)應(yīng)一組映射關(guān)系。

但目錄為什么是2呢?

[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用?。ň彌_區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤

因?yàn)槟夸浝锩孢€有隱藏文件.文件,也就是說(shuō)inode對(duì)應(yīng)2個(gè)文件名(自己目錄名,自己目錄內(nèi)部的文件名),所以引用計(jì)數(shù)為2。

4??動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)

??靜態(tài)庫(kù)

?????????靜態(tài)庫(kù)(.a):程序在編譯鏈接的時(shí)候把庫(kù)的代碼鏈接到可執(zhí)行文件中。程序運(yùn)行的時(shí)候?qū)⒉辉傩枰o態(tài)庫(kù)。

??生成靜態(tài)庫(kù)

打包.o文件:ar -rc xxx.a xxx.o xxx.o
解析 ar是gnu歸檔工具 ar——archieve  r——replace c ——create ,把.o文件打包到.a(靜態(tài)庫(kù))

??將myprint.o、mymath.o打包到libtest.a

myprint.h代碼:

#pragma once

#include<stdio.h>
#include<time.h>

extern void Print(const char* str);

myprint.c代碼:

#include"myprint.h"

void Print(const char* str)
{
    printf("%s[%d]\n",str,(int)time(NULL));
}

mymath.h代碼:
?

#pragma once

#include<stdio.h>

extern int addToTarget(int form,int to);

mymath.c代碼:

#include"mymath.h"

int addToTarget(int form,int to)
{
    int sum=0;
    for(int i=form;i<=to;i++)
    {
        sum+=i;
    }
    return sum;
}

Makefile:

libtest.a:mymath.o myprint.o
	ar -rc libtest.a mymath.o myprint.o
mymath.o:
	gcc -c mymath.c -o mymath.o -std=c99
myprint.o:
	gcc -c myprint.c -o myprint.o -std=c99

.PHONY:clean
clean:
	rm -rf *.o *.a 
[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用?。ň彌_區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤
靜態(tài)庫(kù)生成圖

??使用靜態(tài)庫(kù)

gcc main.c -I 指定頭文件搜索路徑 -L 指定庫(kù)文件搜索路徑 -l使用哪個(gè)庫(kù)

??使用上面生成的libtest.a靜態(tài)庫(kù)

修改Makefile文件,將頭文件放到include目錄中,靜態(tài)庫(kù)放到lib目錄中。

libtest.a:mymath.o myprint.o
	ar -rc libtest.a mymath.o myprint.o
mymath.o:
	gcc -c mymath.c -o mymath.o -std=c99
myprint.o:
	gcc -c myprint.c -o myprint.o -std=c99

.PHONY:output
output:
	mkdir -p lib
	mkdir -p include
	cp -rf *.h include
	cp -rf *.a lib

.PHONY:clean
clean:
	rm -rf *.o *.a lib include

[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用?。ň彌_區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤

使用靜態(tài)庫(kù)生成可執(zhí)行文件:

[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用?。ň彌_區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤

??動(dòng)態(tài)庫(kù)

?動(dòng)態(tài)庫(kù)(.so):程序在運(yùn)行的時(shí)候才去鏈接動(dòng)態(tài)庫(kù)的代碼,多個(gè)程序共享使用庫(kù)的代碼。

??生成動(dòng)態(tài)庫(kù)

生成動(dòng)態(tài)庫(kù)的必須加 -fPIC?生成二進(jìn)制文件

-shared告訴gcc生成動(dòng)態(tài)庫(kù)

gcc -fPIC -c xxxx.c -o xxxx.o //生成動(dòng)態(tài)庫(kù)必須加-fPIC
gcc -shared xxxx.o -o libxxxx.so  //-shared告訴gcc生成動(dòng)態(tài)庫(kù)

??生成libtest.so動(dòng)態(tài)庫(kù)

編寫Makefile文件:

libtest.so:mymath_d.o myprint_d.o
	gcc -shared mymath_d.o myprint_d.o -o libtest.so
mymath_d.o:mymath.c
	gcc -fPIC -c mymath.c -o mymath_d.o -std=c99
myprint_d.o:myprint.c
	gcc -fPIC -c myprint.c -o myprint_d.o -std=c99

.PHONY:output
output:
	mkdir -p lib
	mkdir -p include
	cp -rf *.h include
	cp -rf *.so lib

.PHONY:clean
clean:
	rm -rf *.o  *.so lib include
[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用!(緩沖區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤
生成動(dòng)態(tài)庫(kù)

??使用動(dòng)態(tài)庫(kù)

動(dòng)態(tài)庫(kù)的使用和靜態(tài)庫(kù)是一樣的。

gcc main.c -I 指定頭文件搜索路徑 -L 指定庫(kù)文件搜索路徑 -l使用哪個(gè)庫(kù)

??main.c使用動(dòng)態(tài)庫(kù)libtest.so

查看程序鏈接的庫(kù)(動(dòng)態(tài)庫(kù)):ldd

ldd 可執(zhí)行程序    //查看程序鏈接的庫(kù)

[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用!(緩沖區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤

??同時(shí)存在使用靜態(tài)庫(kù)還是動(dòng)態(tài)庫(kù)?

問(wèn)題:假設(shè)現(xiàn)在既有靜態(tài)庫(kù)又有動(dòng)態(tài)庫(kù),那么程序默認(rèn)鏈接的是哪種庫(kù)?

修改Makefile文件:

.PHONY:all
all:libtest.so libtest.a

libtest.so:mymath_d.o myprint_d.o
	gcc -shared mymath_d.o myprint_d.o -o libtest.so
mymath_d.o:mymath.c
	gcc -fPIC -c mymath.c -o mymath_d.o -std=c99
myprint_d.o:myprint.c
	gcc -fPIC -c myprint.c -o myprint_d.o -std=c99

libtest.a:mymath.o myprint.o
	ar -rc libtest.a mymath.o myprint.o
mymath.o:
	gcc -c mymath.c -o mymath.o -std=c99
myprint.o:
	gcc -c myprint.c -o myprint.o -std=c99

.PHONY:clean
clean:
	rm -rf *.o *.a *.so 

現(xiàn)象:

[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用?。ň彌_區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤

驗(yàn)證發(fā)現(xiàn)同時(shí)存在靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)默認(rèn)使用的是動(dòng)態(tài)庫(kù)。

那么如何在這種情況使用靜態(tài)庫(kù)呢?? -static? 指定靜態(tài)鏈接

-static的意義:摒棄默認(rèn)優(yōu)先使用動(dòng)態(tài)庫(kù)的原則,而是直接使用靜態(tài)庫(kù)。

[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用?。ň彌_區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)),我在地球?qū)WLinux,linux,運(yùn)維,用戶級(jí)緩沖區(qū),文件系統(tǒng),軟硬連接,動(dòng)靜態(tài)庫(kù),磁盤

使用ldd查看鏈接的動(dòng)態(tài)庫(kù),報(bào)錯(cuò)顯示:不是動(dòng)態(tài)可執(zhí)行文件,也就是說(shuō)使用的是靜態(tài)庫(kù)??!

??特點(diǎn)總結(jié)

??靜態(tài)庫(kù)特點(diǎn)

? ? ? ? ? ? ? ? 優(yōu)點(diǎn):

????????????????①靜態(tài)庫(kù)被打包到應(yīng)用程序中加載速度快
????????????????②發(fā)布程序無(wú)需提供靜態(tài)庫(kù),移植方便

????????????????缺點(diǎn):

????????????????①相同的庫(kù)文件數(shù)據(jù)可能在內(nèi)存中被加載多份,消耗系統(tǒng)資源,浪費(fèi)內(nèi)存
????????????????②庫(kù)文件更新需要重新編譯項(xiàng)目文件,生成新的可執(zhí)行程序,浪費(fèi)時(shí)間

??動(dòng)態(tài)庫(kù)特點(diǎn)

? ? ? ? ? ? ? ? 優(yōu)點(diǎn):

????????????????①可實(shí)現(xiàn)不同進(jìn)程間的資源共享
????????????????②動(dòng)態(tài)庫(kù)升級(jí)簡(jiǎn)單,只需要替換庫(kù)文件,無(wú)需重新編譯應(yīng)用程序
????????????????③可以控制何時(shí)加載動(dòng)態(tài)庫(kù),不調(diào)用庫(kù)函數(shù)動(dòng)態(tài)庫(kù)不會(huì)被加載? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

????????????????缺點(diǎn):

????????????????①加載速度比靜態(tài)庫(kù)慢
????????????????②發(fā)布程序需要提供依賴的動(dòng)態(tài)庫(kù)


????????文末結(jié)語(yǔ),開(kāi)篇解釋緩沖區(qū)以及意義,并驗(yàn)證了用戶級(jí)緩沖區(qū)的刷新策略,接下來(lái)談文件系統(tǒng),首先介紹磁盤的存儲(chǔ)結(jié)構(gòu)(包括物理結(jié)構(gòu)和抽象結(jié)構(gòu)),介紹inode和文件名之間的關(guān)系,軟硬鏈接的使用,最后講解動(dòng)靜態(tài)庫(kù),詳細(xì)說(shuō)明如何制作并使用動(dòng)靜態(tài)庫(kù),并探究了動(dòng)靜態(tài)庫(kù)同時(shí)存在時(shí)默認(rèn)使用動(dòng)態(tài)庫(kù),以及想使用靜態(tài)庫(kù)的解決方案,最終總結(jié)動(dòng)靜態(tài)的特點(diǎn)。本篇旨在分享記錄知識(shí),如有需要,希望能有所幫助!!感謝觀看!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-638015.html

到了這里,關(guān)于[Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用?。ň彌_區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【看表情包學(xué)Linux】文件描述符 | 重定向 Redirection | dup2 函數(shù) | 緩沖區(qū)的理解 (Cache)

    【看表情包學(xué)Linux】文件描述符 | 重定向 Redirection | dup2 函數(shù) | 緩沖區(qū)的理解 (Cache)

    ?? ??? 爆笑 教程 ????《看表情包學(xué)Linux》?? ? 猛戳訂閱 ? ? ?? ?? 寫在前面: 在上一章中,我們已經(jīng)把 fd 的基本原理搞清楚了。本章我們將開(kāi)始探索 fd 的應(yīng)用特征,探索 文件描述符的分配原則。講解重定向,上一章是如何使用 fflush 把內(nèi)容變出來(lái)的,介紹 dup2 函數(shù),

    2023年04月25日
    瀏覽(19)
  • 【Linux】詳解動(dòng)靜態(tài)庫(kù)的制作和使用&&動(dòng)靜態(tài)庫(kù)在系統(tǒng)中的配置步驟

    【Linux】詳解動(dòng)靜態(tài)庫(kù)的制作和使用&&動(dòng)靜態(tài)庫(kù)在系統(tǒng)中的配置步驟

    1、提高開(kāi)發(fā)效率,讓開(kāi)發(fā)者所有的函數(shù)實(shí)現(xiàn)不用從零開(kāi)始。 2、隱藏源代碼。 ??????? ?庫(kù)其實(shí)就是所有的.o文件用特定的方式進(jìn)行打包形成一個(gè)文件,各個(gè).o文件包含了源代碼中的機(jī)器語(yǔ)言指令。 先將我們的.c文件或者是.cpp文件形成.o文件,指令為: gcc/g++ -c 要形成的.o文

    2024年04月17日
    瀏覽(24)
  • 動(dòng)靜態(tài)庫(kù)的理解、制作、使用。

    動(dòng)靜態(tài)庫(kù)的理解、制作、使用。

    1.什么是庫(kù)? 代碼是無(wú)窮無(wú)盡的,當(dāng)程序猿在寫一些項(xiàng)目時(shí),未必所有代碼親歷親為,他們可以在網(wǎng)上尋找大佬寫過(guò)的一些有關(guān)需求的代碼,這些代碼可以讓他們拿過(guò)來(lái)直接使用,而省去了許多精力。 把一些 代碼進(jìn)行打包 ,形成的便是庫(kù)了。 ? 上面所說(shuō),庫(kù)就是將代碼進(jìn)行

    2024年01月24日
    瀏覽(56)
  • 【linux基礎(chǔ)I/O(二)】文件系統(tǒng)講解以及文件緩沖區(qū)的概念

    【linux基礎(chǔ)I/O(二)】文件系統(tǒng)講解以及文件緩沖區(qū)的概念

    ??博主CSDN主頁(yè):杭電碼農(nóng)-NEO?? ? ?專欄分類:Linux從入門到精通? ? ??代碼倉(cāng)庫(kù):NEO的學(xué)習(xí)日記?? ? ??關(guān)注我??帶你學(xué)更多操作系統(tǒng)知識(shí) ? ???? 對(duì)于文件來(lái)講,有打開(kāi)的在內(nèi)存中 的文件,也有沒(méi)有打開(kāi)的在磁盤上 文件,上一篇文章講解的是前者,本篇 文章將帶大家了解后

    2024年01月19日
    瀏覽(33)
  • 【Linux】緩沖區(qū)+磁盤+動(dòng)靜態(tài)庫(kù)

    【Linux】緩沖區(qū)+磁盤+動(dòng)靜態(tài)庫(kù)

    緩沖區(qū)的本質(zhì)就是一段用作緩存的 內(nèi)存 。 節(jié)省進(jìn)程進(jìn)行數(shù)據(jù)IO的時(shí)間。進(jìn)程使用fwrite等函數(shù)把數(shù)據(jù)拷貝到緩沖區(qū)或者外設(shè)中。 3.1、 立即刷新(無(wú)緩沖)——ffush() 情況很少,比如調(diào)用printf后,手動(dòng)調(diào)用fflush刷新緩沖區(qū)。 3.2、 行刷新(行緩沖)——顯示器 顯示器需要滿足人

    2024年02月05日
    瀏覽(26)
  • 【Linux】理解緩沖區(qū)

    【Linux】理解緩沖區(qū)

    我們發(fā)現(xiàn) printf 和 fwrite (庫(kù)函數(shù))都輸出了2次,而 write 只輸出了一次(系統(tǒng)調(diào)用)。為什么呢?肯定和fork有關(guān)! C接口的函數(shù)被打印了兩次系統(tǒng)接口前后只是打印了一次:和fork函數(shù)有關(guān),fork會(huì)創(chuàng)建子進(jìn)程。在創(chuàng)建子進(jìn)程的時(shí)候,數(shù)據(jù)會(huì)被處理成兩份,父子進(jìn)程發(fā)生寫時(shí)拷

    2024年01月23日
    瀏覽(19)
  • 【Linux】深入理解緩沖區(qū)

    【Linux】深入理解緩沖區(qū)

    目錄 什么是緩沖區(qū) 為什么要有緩沖區(qū) 緩沖區(qū)刷新策略 緩沖區(qū)在哪里 ?手動(dòng)設(shè)計(jì)一個(gè)用戶層緩沖區(qū) 緩沖區(qū)本質(zhì)上一塊內(nèi)存區(qū)域,用來(lái)保存臨時(shí)數(shù)據(jù)。 緩沖區(qū)在各種計(jì)算任務(wù)中都廣泛應(yīng)用,包括輸入/輸出操作、網(wǎng)絡(luò)通信、圖像處理、音頻處理等。 這塊內(nèi)存區(qū)域是由 誰(shuí)提供的

    2024年02月15日
    瀏覽(22)
  • Linux之緩沖區(qū)的理解

    Linux之緩沖區(qū)的理解

    目錄 一、問(wèn)題引入 二、緩沖區(qū) 1、什么是緩沖區(qū) 2、刷新策略 3、緩沖區(qū)由誰(shuí)提供 4、重看問(wèn)題 三、緩沖區(qū)的簡(jiǎn)單實(shí)現(xiàn) 我們先來(lái)看看下面的代碼:我們使用了C語(yǔ)言接口和系統(tǒng)調(diào)用接口來(lái)進(jìn)行文件操作。在代碼的最后,我們還使用fork函數(shù)創(chuàng)建了一個(gè)子進(jìn)程。 ?代碼運(yùn)行結(jié)果如

    2024年02月03日
    瀏覽(24)
  • 【Linux】基礎(chǔ)IO----理解緩沖區(qū)

    【Linux】基礎(chǔ)IO----理解緩沖區(qū)

    作者:?舊言~ 座右銘:松樹(shù)千年終是朽,槿花一日自為榮。 目標(biāo):理解緩沖區(qū) 毒雞湯:有些事情,總是不明白,所以我不會(huì)堅(jiān)持。早安! 專欄選自:Linux初階 望小伙伴們點(diǎn)贊??收藏?加關(guān)注喲???? 緩沖區(qū)大家其實(shí)不陌生,像我們使用的 VS2019 編譯器這里就有緩沖區(qū),那它

    2024年04月13日
    瀏覽(21)
  • 用Linux的視角來(lái)理解緩沖區(qū)概念

    用Linux的視角來(lái)理解緩沖區(qū)概念

    緩沖區(qū)(buffer)是存儲(chǔ)數(shù)據(jù)的臨時(shí)存儲(chǔ)區(qū)域。當(dāng)我們用C語(yǔ)言向文件中寫入數(shù)據(jù)時(shí),數(shù)據(jù)并不會(huì)直接的寫到文件中,中途還經(jīng)過(guò)了緩沖區(qū),而我們需要對(duì)緩沖區(qū)的數(shù)據(jù)進(jìn)行刷新,那么數(shù)據(jù)才算寫到文件當(dāng)中。而緩沖區(qū)通常是一塊內(nèi)存區(qū)域,可以是數(shù)組、隊(duì)列、鏈表等數(shù)據(jù)結(jié)構(gòu)。

    2024年01月20日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包