中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

怎么做網(wǎng)站主頁(yè)設(shè)計(jì)網(wǎng)站seo收錄

怎么做網(wǎng)站主頁(yè)設(shè)計(jì),網(wǎng)站seo收錄,手機(jī)app快速開(kāi)發(fā)工具,有哪些做婚禮電子請(qǐng)柬的網(wǎng)站C文件IO相關(guān)接口 fopen函數(shù) pathname: 要打開(kāi)的文件名字符串mode: 訪問(wèn)文件的模式 模式描述含義“r”讀文件不存在失敗返回null“r”讀寫文件不存在打開(kāi)失敗返回null,文件存在則從頭開(kāi)始覆蓋現(xiàn)有的數(shù)據(jù)(不會(huì)清空數(shù)據(jù))“w”寫文件不存在創(chuàng)建…

C文件IO相關(guān)接口

fopen函數(shù)

image.png

  • pathname: 要打開(kāi)的文件名字符串
  • mode: 訪問(wèn)文件的模式
模式描述含義
“r”文件不存在失敗返回null
“r+”讀寫文件不存在打開(kāi)失敗返回null,文件存在則從頭開(kāi)始覆蓋現(xiàn)有的數(shù)據(jù)(不會(huì)清空數(shù)據(jù))
“w”文件不存在創(chuàng)建文件,文件存在則清空文件
“w+”讀寫文件不存在創(chuàng)建文件,文件存在清空文件
“a”文件不存在創(chuàng)建文件,文件存在數(shù)據(jù)被附加到文件末尾
“a+”讀寫文件不存在創(chuàng)建文件,文件存在數(shù)據(jù)被附加到文件末尾

fclose函數(shù)

image.png

fwrite函數(shù)

image.png
情景一:
在沒(méi)有myfile文件的情況下一”w“方式打開(kāi)文件。

#include<stdio.h>
#include<string.h>int main()
{FILE* fd=fopen("myfile","w");if(!fd){printf("fopen error!\n");}const char *msg="hello world\n";int cnt=6;while(cnt--){fwrite(msg,strlen(msg),1,fd);}fclose(fd);return 0;
}

以上的代碼會(huì)出現(xiàn)的情況:在當(dāng)前目錄創(chuàng)建了一個(gè)叫myfile的文件,并且會(huì)往文件中寫入數(shù)據(jù)。
image.png
情景二:
存在myfile 文件的時(shí)候使用”r“方式打開(kāi)文件

#include<stdio.h>
#include<string.h>
#include <unistd.h>
#include <sys/types.h>int main()
{FILE*fd=fopen("myfile","r");if(!fd){printf("fopen error!\n");}char buf[1024];const char*msg="hello world\n";while(1){ssize_t s=fread(buf,1,strlen(msg),fd);if(s>0){buf[s]=0;printf("%s",buf);}if(feof(fd)){break;}}fclose(fd);return 0;
}

以上的代碼會(huì)出現(xiàn)的情況:會(huì)讀取當(dāng)前目錄下的myfile文件,并且會(huì)往文件中的數(shù)據(jù)讀取到顯示器上。
image.png
feof是檢測(cè)流上的文件結(jié)束符的函數(shù),如果文件結(jié)束,則返回非0值,否則返回0;站在光標(biāo)所在位置,向后看還有沒(méi)有字符,如果有,返回0;如果沒(méi)有,返回非0。它并不會(huì)讀取相關(guān)信息,只是查看光標(biāo)后是否還有內(nèi)容。

  • C語(yǔ)言會(huì)默認(rèn)打開(kāi)三個(gè)輸入輸出流,分別是stdin,stdout,stderr

系統(tǒng)接口訪問(wèn)文件

open函數(shù)

image.png
pathname: 要打開(kāi)或創(chuàng)建的目標(biāo)文件
flags: 打開(kāi)文件時(shí),可以傳入多個(gè)參數(shù)選項(xiàng),用下面的一個(gè)或者多個(gè)常量進(jìn)行“或”運(yùn)算,構(gòu)成flags。
參數(shù):
O_RDONLY: 只讀打開(kāi)
O_WRONLY: 只寫打開(kāi)
O_RDWR : 讀,寫打開(kāi)
**這三個(gè)常量,必須指定一個(gè)且只能指定一個(gè) **
O_CREAT : 若文件不存在,則創(chuàng)建它。需要使用mode選項(xiàng),來(lái)指明新文件的訪問(wèn)權(quán)限
O_APPEND: 追加寫
返回值:
成功:新打開(kāi)的文件描述符
失敗:-1

write函數(shù)

write(int fd, const void *buf, size_t count);
第一個(gè)參數(shù) 文件描述符fd
第二個(gè)參數(shù) 無(wú)類型的指針buf,可以存放要寫的內(nèi)容
第三個(gè)參數(shù) 寫多少字節(jié)數(shù)
返回值:如果順利write()會(huì)返回實(shí)際寫入的字節(jié)數(shù)(len)。錯(cuò)誤發(fā)生時(shí)則返回-1。

close函數(shù)

image.png

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main()
{int fd = open("myfile", O_RDONLY);if (fd < 0){perror("open");return 1;}const char *msg = "hello world\n";char buf[1024];while (1){ssize_t s = read(fd, buf, strlen(msg)); // 類比writeif (s > 0){printf("%s", buf);}else{break;}}close(fd);return 0;
}

image.png

文件描述符

在Linux操作系統(tǒng)中,文件描述符是一種用于訪問(wèn)文件或輸入/輸出資源的抽象概念,它是為了更有效地管理和操作文件、設(shè)備、套接字等資源而引入的。文件描述符的作用和重要性在操作系統(tǒng)和編程中具有深遠(yuǎn)意義。

  • Liunx x進(jìn)程默認(rèn)情況下會(huì)打開(kāi)的文件描述符,分別是標(biāo)準(zhǔn)輸入0, 標(biāo)準(zhǔn)輸出1,標(biāo)準(zhǔn)錯(cuò)誤2.
  • 0,1,2對(duì)應(yīng)的物理設(shè)備一般是:鍵盤,顯示器,顯示器
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main()
{char buf[1024];ssize_t s = read(0, buf, sizeof(buf));if (s > 0){buf[s] = 0;write(1, buf, strlen(buf));write(2, buf, strlen(buf));}return 0;
}

image.png
文件描述符是一個(gè)下標(biāo),是用來(lái)標(biāo)識(shí)和操作文件或者輸入輸出設(shè)備的整數(shù)。每個(gè)打開(kāi)的文件(包括標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出)都會(huì)被分配一個(gè)唯一的文件描述符。
文件描述符的分配規(guī)則:在files_struct數(shù)組當(dāng)中,找到當(dāng)前沒(méi)有被使用的最小的一個(gè)下標(biāo),作為新的文件描述符。

重定向

我們平常的輸入是從標(biāo)準(zhǔn)輸入(鍵盤)讀取,輸出往標(biāo)準(zhǔn)輸出(顯示器)打印!輸入和輸出重定向就是不再?gòu)臉?biāo)準(zhǔn)輸入讀取,向標(biāo)準(zhǔn)輸出打印了,就是從指定的文件讀取,或只輸入到指定文件。
輸出通常包含兩種類型:

  • 一種是程序運(yùn)行的結(jié)果,即該程序生成的數(shù)據(jù);
  • 另一種是狀態(tài)和錯(cuò)誤信息,表示當(dāng)前程序的運(yùn)行狀況。

什么是輸入:
默認(rèn)情況下,標(biāo)準(zhǔn)輸入連接到鍵盤。I/O重定向功能可以改變輸出內(nèi)容發(fā)送的目的地,也可以改變輸入內(nèi)容的來(lái)源地。
前提知識(shí):
操作系統(tǒng)內(nèi)部只認(rèn)識(shí)只認(rèn)識(shí)文件標(biāo)識(shí)符fd,并不認(rèn)識(shí)所謂的stdin、stdout。
文件描述符的分配規(guī)則是從小到大沒(méi)有被分配的文件描述符分配給新文件。
總結(jié):
如果我們關(guān)閉標(biāo)準(zhǔn)輸出,然后打開(kāi)指定的文件,這時(shí)新打開(kāi)的文件fd的值,就是我們剛剛關(guān)閉的標(biāo)準(zhǔn)輸出文件的fd的值,所以我們就可以把輸出定向到這個(gè)文件。這就是我們說(shuō)的輸出重定向,輸入重定向也是一樣的。
image.png

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
int main()
{close(1);int fd = open("myfile", O_WRONLY | O_CREAT, 00644);if (fd < 0){perror("open");return 1;}printf("fd: %d\n", fd);fflush(stdout);close(fd);exit(0);
}

image.png
問(wèn)題:

  1. 重定向的本質(zhì)是什么?

就是修改特定的文件描述符。

dup2系統(tǒng)調(diào)用

#include <unistd.h>
int dup2(int oldfd, int newfd);
dup2函數(shù)是Unix/Linux系統(tǒng)提供的一個(gè)系統(tǒng)調(diào)用函數(shù)其作用是

  1. 復(fù)制文件描述符
  2. 指定新的文件描述符

image.png
參數(shù):

  • oldfd表示待復(fù)制的文件描述符
  • newfd表示新的文件描述符

返回值:
該函數(shù)返回新的文件描述符,若出錯(cuò)則返回-1。
工作原理:

  • 檢查oldfd和newfd是否相等,若相等則不進(jìn)行任何操作,直接返回newfd;
  • 檢查newfd的合法性,若已經(jīng)打開(kāi),則先關(guān)閉;
  • 復(fù)制oldfd的文件表項(xiàng)到newfd,使得兩者指向同一個(gè)文件表項(xiàng);
  • 返回newfd。
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{int fd = open("./log", O_CREAT | O_RDWR,0666);if (fd < 0){perror("open");return 1;}close(1);dup2(fd, 1);for (;;){char buf[1024] = {0};ssize_t read_size = read(0, buf, sizeof(buf) - 1);if (read_size < 0){perror("read");break;}printf("%s", buf);fflush(stdout);}return 0;
}

過(guò)程:
通過(guò)open函數(shù)打開(kāi)文件,如果不存在就創(chuàng)建,存在就打開(kāi)文件;然后關(guān)閉close描述符;在使用dup2函數(shù)復(fù)制描述符;最后把輸入的東西輸出到文件中。

FILE

本質(zhì)就是C語(yǔ)言提供的結(jié)構(gòu)體

struct _iobuf {char *_ptr;				// 文件輸入的下一個(gè)位置int   _cnt;				// 當(dāng)前緩沖區(qū)位置char *_base;			// 文件起始位置int   _flag;			// 文件標(biāo)志int   _file;			// 文件有效性驗(yàn)證int   _charbuf;			// 當(dāng)前緩沖區(qū)狀況int   _bufsiz;			// 緩沖區(qū)大小char *_tmpfname;		// 臨時(shí)文件名};typedef struct _iobuf FILE;     //別名FILE,可以直接用

緩存區(qū)

緩沖區(qū)(Buffer)是內(nèi)存空間的一部分。也就是說(shuō),在內(nèi)存中預(yù)留了一定的存儲(chǔ)空間,用來(lái)暫時(shí)保存輸入或輸出的數(shù)據(jù),這部分預(yù)留的空間就叫做緩沖區(qū)。
緩存區(qū)根據(jù)對(duì)應(yīng)的設(shè)備分為:
輸入緩存區(qū)和輸出緩存區(qū)
緩存區(qū)的分類
完全緩存:就是等整個(gè)緩存區(qū)被填滿,才會(huì)被刷新緩存。
無(wú)緩存:不對(duì)輸入輸出操作進(jìn)行緩存,對(duì)流的讀寫可以立即操作實(shí)際文件。
行緩存:當(dāng)一行結(jié)束的時(shí)候便開(kāi)始刷新緩存,想要刷新行緩存,只要使用換行符’\n’便成功。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main()
{const char *msg0 = "hello printf\n";const char *msg1 = "hello fwrite\n";const char *msg2 = "hello write\n";printf("%s", msg0);fwrite(msg1, strlen(msg0), 1, stdout);write(1, msg2, strlen(msg2));fork();return 0;
}

運(yùn)行結(jié)果:
image.png
但如果對(duì)進(jìn)程實(shí)現(xiàn)輸出重定向呢? ./hello > file , 我們發(fā)現(xiàn)結(jié)果變成了:
image.png
現(xiàn) printf 和 fwrite (庫(kù)函數(shù))都輸出了2次,而 write 只輸出了一次(系統(tǒng)調(diào)用)。為什么呢?肯定和 fork有關(guān)!

  • 一般C庫(kù)函數(shù)寫入文件時(shí)是全緩沖的,而寫入顯示器是行緩沖。
  • printf fwrite 庫(kù)函數(shù)會(huì)自帶緩沖區(qū)(進(jìn)度條例子就可以說(shuō)明),當(dāng)發(fā)生重定向到普通文件時(shí),數(shù)據(jù)的緩沖方式由行緩沖變成了全緩沖。
  • 而我們放在緩沖區(qū)中的數(shù)據(jù),就不會(huì)被立即刷新,甚至fork之后
  • 但是進(jìn)程退出之后,會(huì)統(tǒng)一刷新,寫入文件當(dāng)中。
  • 但是fork的時(shí)候,父子數(shù)據(jù)會(huì)發(fā)生寫時(shí)拷貝,所以當(dāng)你父進(jìn)程準(zhǔn)備刷新的時(shí)候,子進(jìn)程也就有了同樣的 一份數(shù)據(jù),隨即產(chǎn)生兩份數(shù)據(jù)。
  • write 沒(méi)有變化,說(shuō)明沒(méi)有所謂的緩沖。

問(wèn)題:

  1. 緩存區(qū)存在的意義?

緩存主要是為了提高數(shù)據(jù)的讀取速度。因?yàn)榉?wù)器和應(yīng)用客戶端之間存在著流量的瓶頸,所以讀取大容量數(shù)據(jù)時(shí),使用緩存來(lái)直接為客戶端服務(wù),可以減少客戶端與服務(wù)器端的數(shù)據(jù)交互,從而大大提高程序的性能。

文件系統(tǒng)

文件系統(tǒng)的底層原理

Linux文件系統(tǒng)中的文件是數(shù)據(jù)的集合,文件系統(tǒng)不僅包含著文件中的數(shù)據(jù)而且還有文件系統(tǒng)的結(jié)構(gòu),所有Linux 用戶和程序看到的文件、目錄、軟連接及文件保護(hù)信息等都存儲(chǔ)在其中。
底層原理圖:
image.png
image.png
每行包括7列:(模式、硬鏈接數(shù)、文件所有者、組、大小、最后修改時(shí)間、文件名)
產(chǎn)生inode的前提?
文件是存儲(chǔ)在硬盤上的。硬盤的最小單位是扇區(qū),每個(gè)扇區(qū)的大小為512字節(jié)。如果系統(tǒng)在讀取硬盤數(shù)據(jù)的時(shí)候按扇區(qū)一個(gè)一個(gè)來(lái)讀取,那效率就太低了,而是一次連續(xù)性讀取多個(gè)扇區(qū),所以設(shè)計(jì)者又將多個(gè)扇區(qū)整合成一個(gè)塊(block),所以,塊就是文件存取的最小單位。一個(gè)塊的大小為4k。我們現(xiàn)在已經(jīng)有了塊的概念,文件數(shù)據(jù)就是存放在塊中。但光有數(shù)據(jù)還是不行啊?為了方便管理文件,我們還需要文件的元信息,比如文件的屬性,創(chuàng)建時(shí)間,權(quán)限,所占的塊大小,數(shù)量等等。
什么是inode?
inode 是一個(gè)關(guān)鍵的元數(shù)據(jù)結(jié)構(gòu),每個(gè)文件或目錄都有一個(gè)唯一的 inode 號(hào)碼來(lái)標(biāo)識(shí)它。inode 存儲(chǔ)了文件的類型、所有者、權(quán)限、時(shí)間戳、數(shù)據(jù)塊分配情況等信息,而文件的實(shí)際內(nèi)容則存儲(chǔ)在數(shù)據(jù)塊中。通過(guò) inode,文件系統(tǒng)可以快速地查找和訪問(wèn)文件的相關(guān)信息,而不必遍歷整個(gè)文件系統(tǒng)。所以硬盤在分區(qū)的時(shí)候會(huì)分為兩個(gè)區(qū)域,一個(gè)區(qū)域存放數(shù)據(jù),一個(gè)區(qū)域存放inode信息。
還可以通過(guò)stat命令看到更多的信息
image.png
文件名
inode編號(hào)
文件擁有者uid
文件的所屬用戶組 gid
文件的可讀,可寫,可執(zhí)行權(quán)限 :Access: (0755/drwxr-xr-x)
文件的時(shí)間戳:

  • access time : 文件上一次打開(kāi)的時(shí)間
  • modify time:文件內(nèi)容上一次修改的時(shí)間
  • change time :文件的inode信息上一改變的時(shí)間

硬鏈接數(shù):links
文件數(shù)據(jù)的所占用的塊:blocks
文件所占用的字節(jié)數(shù) size

超級(jí)塊(Super Block):存放文件系統(tǒng)本身的結(jié)構(gòu)信息。記錄的信息主要有:bolck 和 inode的總量, 未使用的block和inode的數(shù)量,一個(gè)block和inode的大小,最近一次掛載的時(shí)間,最近一次寫入數(shù)據(jù)的 時(shí)間,最近一次檢驗(yàn)磁盤的時(shí)間等其他文件系統(tǒng)的相關(guān)信息。Super Block的信息被破壞,可以說(shuō)整個(gè) 文件系統(tǒng)結(jié)構(gòu)就被破壞了
GDT,Group Descriptor Table:塊組描述符,描述塊組屬性信息
塊位圖(Block Bitmap):Block Bitmap中記錄著DataBlock中哪個(gè)數(shù)據(jù)塊已經(jīng)被占用,哪個(gè)數(shù)據(jù)塊沒(méi)有被占用
inode位圖(inode Bitmap):每個(gè)bit表示一個(gè)inode是否空閑可用。
i節(jié)點(diǎn)表:存放文件屬性 如 文件大小,所有者,最近修改時(shí)間等
數(shù)據(jù)塊:存放文件內(nèi)容

文件系統(tǒng)是什么

文件系統(tǒng)是操作系統(tǒng)用于明確存儲(chǔ)設(shè)備(常見(jiàn)的是磁盤,也有基于NAND Flash的固態(tài)硬盤)或分區(qū)上的文件的方法和數(shù)據(jù)結(jié)構(gòu),即在存儲(chǔ)設(shè)備上組織文件的方法。操作系統(tǒng)中負(fù)責(zé)管理和存儲(chǔ)文件信息的軟件機(jī)構(gòu)稱為文件管理系統(tǒng),簡(jiǎn)稱文件系統(tǒng)。
常見(jiàn)的幾種文件結(jié)構(gòu):
image.png

文件系統(tǒng)的作用

文件系統(tǒng)的功能包括:管理和調(diào)度文件的存儲(chǔ)空間,提供文件的邏輯結(jié)構(gòu)、物理結(jié)構(gòu)和存儲(chǔ)方法;實(shí)現(xiàn)文件從標(biāo)識(shí)到實(shí)際地址的映射,實(shí)現(xiàn)文件的控制操作和存取操作,實(shí)現(xiàn)文件信息的共享并提供可靠的文件保密和保護(hù)措施,提供文件的安全措施。

文件系統(tǒng)的分類

FAT(File Allocation Table)
是一種最早的文件系統(tǒng)類型,常用于Windows系統(tǒng),具有簡(jiǎn)單、易于實(shí)現(xiàn)和兼容性好等特點(diǎn),但是對(duì)于大容量硬盤的支持不太好。
NTFS(New Technology File System)
是Windows NT及其后續(xù)版本的默認(rèn)文件系統(tǒng)類型,支持文件和目錄的加密、壓縮、權(quán)限控制等高級(jí)功能,適合大容量硬盤的管理。
EXT(Extended File System)
是Linux系統(tǒng)的默認(rèn)文件系統(tǒng)類型,具有高效、穩(wěn)定、可靠等特點(diǎn),支持大容量硬盤和文件的管理。
HFS(Hierarchical File System)
是Mac OS系統(tǒng)的默認(rèn)文件系統(tǒng)類型,具有對(duì)于蘋果設(shè)備的兼容性好、支持高級(jí)功能等特點(diǎn)。
APFS(Apple File System)
是蘋果公司開(kāi)發(fā)的新一代文件系統(tǒng)類型,適用于蘋果設(shè)備上的存儲(chǔ)管理,具有高效、安全、可靠等特點(diǎn)。

文件的操作

  1. Create,創(chuàng)建不包含任何數(shù)據(jù)的文件。調(diào)用的目的是表示文件即將建立,并對(duì)文件設(shè)置一些屬性。
  2. Delete,當(dāng)文件不再需要,必須刪除它以釋放內(nèi)存空間。為此總會(huì)有一個(gè)系統(tǒng)調(diào)用來(lái)刪除文件。
  3. Open,在使用文件之前,必須先打開(kāi)文件。這個(gè)調(diào)用的目的是允許系統(tǒng)將屬性和磁盤地址列表保存到主存中,用來(lái)以后的快速訪問(wèn)。
  4. Close,當(dāng)所有進(jìn)程完成時(shí),屬性和磁盤地址不再需要,因此應(yīng)關(guān)閉文件以釋放表空間。很多系統(tǒng)限制進(jìn)程打開(kāi)文件的個(gè)數(shù),以此達(dá)到鼓勵(lì)用戶關(guān)閉不再使用的文件。磁盤以塊為單位寫入,關(guān)閉文件時(shí)會(huì)強(qiáng)制寫入最后一塊,即使這個(gè)塊空間內(nèi)部還不滿。
  5. Read,數(shù)據(jù)從文件中讀取。通常情況下,讀取的數(shù)據(jù)來(lái)自文件的當(dāng)前位置。調(diào)用者必須指定需要讀取多少數(shù)據(jù),并且提供存放這些數(shù)據(jù)的緩沖區(qū)。
  6. Write,向文件寫數(shù)據(jù),寫操作一般也是從文件的當(dāng)前位置開(kāi)始進(jìn)行。如果當(dāng)前位置是文件的末尾,則會(huì)直接追加進(jìn)行寫入。如果當(dāng)前位置在文件中,則現(xiàn)有數(shù)據(jù)被覆蓋,并且永遠(yuǎn)消失。
  7. append,使用 append 只能向文件末尾添加數(shù)據(jù)。
  8. seek,對(duì)于隨機(jī)訪問(wèn)的文件,要指定從何處開(kāi)始獲取數(shù)據(jù)。通常的方法是用 seek 系統(tǒng)調(diào)用把當(dāng)前位置指針指向文件中的特定位置。seek 調(diào)用結(jié)束后,就可以從指定位置開(kāi)始讀寫數(shù)據(jù)了。
  9. get attributes,進(jìn)程運(yùn)行時(shí)通常需要讀取文件屬性。
  10. set attributes,用戶可以自己設(shè)置一些文件屬性,甚至是在文件創(chuàng)建之后,實(shí)現(xiàn)該功能的是 set attributes 系統(tǒng)調(diào)用。
  11. rename,用戶可以自己更改已有文件的名字,rename 系統(tǒng)調(diào)用用于這一目的。

硬鏈接

什么是硬鏈接?
由于linux下的文件是通過(guò)索引節(jié)點(diǎn)(Inode)來(lái)識(shí)別文件,硬鏈接可以認(rèn)為是一個(gè)指針,指向文件索引節(jié)點(diǎn)的指針,系統(tǒng)并不為它重新分配inode。每添加一個(gè)一個(gè)硬鏈接,文件的鏈接數(shù)就加1。
硬連接之間沒(méi)有主次之分,刪除某個(gè)硬鏈接,只是將其從目錄的數(shù)據(jù)塊中刪除相關(guān)信息,并且文件鏈接數(shù)減一。不會(huì)從inode表中刪除inode,除非只剩下一個(gè)鏈接數(shù)。
硬鏈接的作用?

  1. 文件引用:硬鏈接為文件和目錄提供了額外的引用。一個(gè)文件可以有多個(gè)硬鏈接,每個(gè)鏈接都指向文件系統(tǒng)中的同一個(gè)inode(索引節(jié)點(diǎn))。
  2. 不增加inode:創(chuàng)建硬鏈接不會(huì)為文件增加新的inode。相反,它只是增加了對(duì)已有inode的引用計(jì)數(shù)。
  3. 跨目錄訪問(wèn):硬鏈接可以位于不同的目錄中,從而允許用戶從多個(gè)位置訪問(wèn)同一個(gè)文件。
  4. 刪除與inode:當(dāng)刪除一個(gè)文件的最后一個(gè)硬鏈接時(shí),該文件的inode和相關(guān)的數(shù)據(jù)塊才會(huì)被釋放。如果文件還有其他硬鏈接,那么刪除其中一個(gè)鏈接并不會(huì)影響文件的內(nèi)容。
  5. 限制:不能跨文件系統(tǒng)創(chuàng)建硬鏈接(即兩個(gè)硬鏈接必須位于同一文件系統(tǒng)中)。此外,不能為目錄創(chuàng)建硬鏈接(盡管技術(shù)上可能,但大多數(shù)系統(tǒng)出于安全和設(shè)計(jì)的考慮禁止這樣做)。
  6. 不影響原文件:與軟鏈接(符號(hào)鏈接)不同,硬鏈接直接指向文件的inode,而不是文件名。因此,即使更改了原始文件名或移動(dòng)了文件,硬鏈接仍然有效。
  7. 權(quán)限:硬鏈接繼承了原始文件的權(quán)限。因此,用戶必須具有適當(dāng)?shù)臋?quán)限才能訪問(wèn)或刪除硬鏈接。
  8. 大小與空間:硬鏈接本身不占用額外的磁盤空間(除了鏈接名本身在目錄項(xiàng)中所需的少量空間)。它們只是指向文件系統(tǒng)中已存在數(shù)據(jù)的指針。
  9. 目錄的硬鏈接:盡管不能直接為目錄創(chuàng)建硬鏈接,但目錄本身是其內(nèi)容的硬鏈接集合。當(dāng)在目錄中創(chuàng)建一個(gè)新文件或子目錄時(shí),該目錄的鏈接計(jì)數(shù)會(huì)增加。

怎么使用硬鏈接?
在Linux系統(tǒng)中,可以使用ln命令來(lái)創(chuàng)建硬鏈接。
ln [options] target_file link_name

  • target_file:目標(biāo)文件,即你希望創(chuàng)建硬鏈接的文件。
  • link_name:鏈接名,即你希望給目標(biāo)文件創(chuàng)建的硬鏈接的名稱。

如果你有一個(gè)名為original_file.txt的文件,并希望為它創(chuàng)建一個(gè)名為alias_file.txt的硬鏈接,你可以使用以下命令:
ln original_file.txt alias_file.txt
執(zhí)行此命令后,alias_file.txt將成為original_file.txt的一個(gè)硬鏈接。它們將共享相同的inode和文件數(shù)據(jù)。
硬鏈接的應(yīng)用?

  • 多用戶共享:當(dāng)多個(gè)用戶需要訪問(wèn)同一份文件時(shí),可以通過(guò)創(chuàng)建硬鏈接的方式,使每個(gè)用戶都能在自己的目錄下訪問(wèn)到該文件,而不需要復(fù)制多份文件。
  • 跨目錄訪問(wèn):硬鏈接可以位于不同的目錄中,方便用戶從多個(gè)位置訪問(wèn)同一個(gè)文件。

軟連接

什么是軟連接?

  • 軟連接:一種特殊的文件或目錄鏈接方式,與硬鏈接(Hard Link)不同,軟連接不會(huì)導(dǎo)致文件或目錄的硬鏈接,而是一種特殊的符號(hào)鏈接。

特點(diǎn)和用途

  1. 符號(hào)鏈接:軟連接(或軟鏈接)包含了另一個(gè)文件的路徑名,它指向的是文件或目錄的路徑,而不是實(shí)際的inode或數(shù)據(jù)塊。
  2. 多個(gè)拷貝管理:主要用于表示一個(gè)文件的多個(gè)拷貝。當(dāng)一個(gè)文件有多個(gè)拷貝時(shí),通常會(huì)選擇一個(gè)主拷貝,而將其他拷貝指向主拷貝,這樣可以避免因?yàn)槎鄠€(gè)拷貝導(dǎo)致的資源沖突。
  3. 鏈接方式
    • 可以鏈接到任意文件或目錄。
    • 可以鏈接不同文件系統(tǒng)的文件。
    • 鏈接文件甚至可以鏈接不存在的文件,產(chǎn)生“斷鏈”現(xiàn)象。
    • 鏈接文件甚至可以循環(huán)鏈接自己,類似于編程語(yǔ)言中的遞歸。
  4. 操作影響
    • 對(duì)符號(hào)文件進(jìn)行讀或?qū)懖僮鲿r(shí),系統(tǒng)會(huì)自動(dòng)把該操作轉(zhuǎn)換為對(duì)源文件的操作。
    • 刪除鏈接文件時(shí),系統(tǒng)僅僅刪除鏈接文件,而不刪除源文件本身。
  5. 創(chuàng)建方法:創(chuàng)建過(guò)程簡(jiǎn)單,只需在當(dāng)前目錄下創(chuàng)建一個(gè)文本文件,在其中輸入軟連接的名稱和目標(biāo)文件的路徑,即可創(chuàng)建一個(gè)軟連接。

軟連接的作用?

  1. 方便性
    軟連接為文件或目錄提供了一個(gè)快捷方式或別名。這允許用戶或程序在不移動(dòng)文件或目錄的情況下,通過(guò)軟連接輕松訪問(wèn)它們。這對(duì)于經(jīng)常需要訪問(wèn)某些文件或目錄的用戶來(lái)說(shuō)非常有用。
  2. 靈活性
    由于軟連接指向的是目標(biāo)文件或目錄的路徑,而不是直接指向文件內(nèi)容或inode,因此它們可以跨文件系統(tǒng)創(chuàng)建。這意味著你可以在一個(gè)文件系統(tǒng)中創(chuàng)建一個(gè)指向另一個(gè)文件系統(tǒng)中文件或目錄的軟連接。這種靈活性使得軟連接在管理和組織分布式文件系統(tǒng)中特別有用。
  3. 動(dòng)態(tài)性
    與硬鏈接不同,軟連接允許目標(biāo)文件或目錄被移動(dòng)、重命名或刪除,而不會(huì)破壞軟連接本身。軟連接只是一個(gè)指向目標(biāo)文件或目錄的路徑,如果目標(biāo)不存在,軟連接將變?yōu)椤八梨溄印被颉皵噫湣?#xff0c;但軟連接本身仍然存在。這種動(dòng)態(tài)性使得軟連接在某些場(chǎng)景中(如軟件部署和配置)特別有用,因?yàn)樗鼈兛梢灾赶蚩赡茈S時(shí)更改的資源文件或配置文件。
  4. 節(jié)省空間
    雖然軟連接本身并不節(jié)省磁盤空間(因?yàn)樗鼈冃枰鎯?chǔ)目標(biāo)文件或目錄的路徑),但它們可以避免在多個(gè)位置復(fù)制相同的文件或目錄,從而節(jié)省總體存儲(chǔ)空間。通過(guò)創(chuàng)建軟連接,你可以在不同的位置引用相同的文件或目錄,而無(wú)需為每個(gè)位置復(fù)制整個(gè)文件或目錄。
  5. 易于管理
    軟連接提供了一種簡(jiǎn)單的方法來(lái)組織和管理文件系統(tǒng)。**通過(guò)創(chuàng)建軟連接,你可以將相關(guān)的文件或目錄組織在一起,即使它們?cè)谖锢砩衔挥诓煌奈恢谩?*這使得文件系統(tǒng)的結(jié)構(gòu)更加清晰和易于理解,從而提高了管理效率。
  6. 兼容性
    軟連接在許多Unix和類Unix系統(tǒng)(如Linux)以及Windows系統(tǒng)中都受到支持。這使得在不同操作系統(tǒng)之間共享和使用文件變得更加容易。通過(guò)創(chuàng)建軟連接,你可以在不同的系統(tǒng)上訪問(wèn)和引用相同的文件或目錄,而無(wú)需擔(dān)心兼容性問(wèn)題。

怎么使用軟連接?

  1. 創(chuàng)建軟連接
    使用ln命令和-s選項(xiàng)來(lái)創(chuàng)建軟連接?;菊Z(yǔ)法如下:
    ln -s [目標(biāo)文件或目錄](méi) [軟連接名稱]
    例如,要在/home/user目錄下為/etc/passwd文件創(chuàng)建一個(gè)名為passwd_link的軟連接,可以執(zhí)行以下命令:
    ln -s /etc/passwd /home/user/passwd_link
  2. 驗(yàn)證軟連接
    可以使用ls -l命令來(lái)查看軟連接的詳細(xì)信息。對(duì)于軟連接,你會(huì)看到類似lrwxrwxrwx的權(quán)限字符串,后面跟著->符號(hào)和指向的目標(biāo)文件或目錄的路徑。
    ls -l /home/user/passwd_link
    輸出
    lrwxrwxrwx 1 user user 11 Jun 30 15:00 /home/user/passwd_link -> /etc/passwd
  3. 使用軟連接
    一旦創(chuàng)建了軟連接,你就可以像使用普通文件或目錄一樣使用它。例如,如果你有一個(gè)指向可執(zhí)行文件的軟連接,你可以直接運(yùn)行它。如果你有一個(gè)指向目錄的軟連接,你可以像訪問(wèn)普通目錄一樣瀏覽它。
  4. 修改軟連接指向
    如果你想修改軟連接指向的目標(biāo)文件或目錄,你需要?jiǎng)h除原有的軟連接,并創(chuàng)建一個(gè)新的指向新目標(biāo)的軟連接。不過(guò),也可以使用ln命令的-snf選項(xiàng)來(lái)直接修改軟連接的指向:
    ln -snf [新的目標(biāo)文件或目錄](méi) [軟連接名稱]
  5. 注意事項(xiàng)
  • 刪除軟連接:與普通文件相同,使用rm命令刪除軟連接。刪除軟連接不會(huì)影響目標(biāo)文件或目錄。
  • 跨文件系統(tǒng):軟連接可以跨文件系統(tǒng)創(chuàng)建,因?yàn)樗鼈冎皇侵赶蚰繕?biāo)文件或目錄的路徑。
  • 權(quán)限:軟連接的權(quán)限與其指向的目標(biāo)文件或目錄的權(quán)限無(wú)關(guān)。但是,你需要有足夠的權(quán)限來(lái)訪問(wèn)目標(biāo)文件或目錄,以便能夠使用軟連接。
  • “斷鏈”或“死鏈”:如果軟連接指向的目標(biāo)文件或目錄被刪除或移動(dòng),軟連接將變?yōu)椤皵噫湣被颉八梨湣?。此時(shí),嘗試訪問(wèn)軟連接將失敗。

軟連接的應(yīng)用?

  • 版本管理:在開(kāi)發(fā)過(guò)程中,開(kāi)發(fā)人員可能需要使用多個(gè)版本的庫(kù)或工具。軟連接可以用于快速切換不同版本的庫(kù)或工具,而不必更改代碼中的引用路徑。
  • 動(dòng)態(tài)庫(kù)管理:軟連接可用于管理動(dòng)態(tài)庫(kù),允許程序在運(yùn)行時(shí)鏈接到不同的庫(kù)版本。

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

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

什么是靜態(tài)庫(kù)?
定義
靜態(tài)庫(kù)是指在開(kāi)發(fā)應(yīng)用程序時(shí),將一些公共的、需要反復(fù)使用的代碼編譯成的一個(gè)“庫(kù)”文件。在鏈接步驟中,連接器會(huì)從靜態(tài)庫(kù)文件中取得所需的代碼,并將這些代碼直接復(fù)制到生成的可執(zhí)行文件中。
特點(diǎn)

  1. 代碼復(fù)制:在鏈接過(guò)程中,靜態(tài)庫(kù)中的代碼會(huì)被直接復(fù)制到可執(zhí)行文件中,因此可執(zhí)行文件會(huì)包含一份完整的庫(kù)代碼拷貝。
  2. 多份冗余:由于每個(gè)使用到靜態(tài)庫(kù)的可執(zhí)行文件都會(huì)包含一份完整的庫(kù)代碼拷貝,因此當(dāng)靜態(tài)庫(kù)被多個(gè)程序使用時(shí),會(huì)在內(nèi)存中產(chǎn)生多份冗余的庫(kù)代碼拷貝。
  3. 編譯依賴:靜態(tài)庫(kù)需要在編譯時(shí)確定所有依賴關(guān)系,因此一旦靜態(tài)庫(kù)更新,所有使用它的程序都需要重新編譯。
  4. 文件類型:在Windows平臺(tái)上,靜態(tài)庫(kù)的文件擴(kuò)展名通常為.lib;在Linux平臺(tái)上,靜態(tài)庫(kù)的文件擴(kuò)展名通常為.a。

優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn)
    • 可執(zhí)行文件不依賴于外部庫(kù)文件,運(yùn)行更穩(wěn)定。
    • 編譯后的可執(zhí)行文件體積相對(duì)較大,但包含了所有必要的代碼和數(shù)據(jù),便于分發(fā)。
  • 缺點(diǎn)
    • 當(dāng)靜態(tài)庫(kù)更新時(shí),所有使用它的程序都需要重新編譯。
    • 如果多個(gè)程序使用同一個(gè)靜態(tài)庫(kù),會(huì)導(dǎo)致內(nèi)存中存在多份冗余的庫(kù)代碼拷貝,浪費(fèi)內(nèi)存資源。

使用方法
在開(kāi)發(fā)過(guò)程中,可以通過(guò)配置編譯器和鏈接器來(lái)使用靜態(tài)庫(kù)。通常需要將靜態(tài)庫(kù)文件添加到項(xiàng)目的鏈接器設(shè)置中,以便在編譯時(shí)正確鏈接到靜態(tài)庫(kù)中的代碼。具體步驟可能因開(kāi)發(fā)環(huán)境和編程語(yǔ)言的不同而有所差異。
如何生成靜態(tài)庫(kù)?

  1. 編寫源代碼
  • 創(chuàng)建源文件(例如:file1.c、file2.c等),并編寫所需的函數(shù)實(shí)現(xiàn)。
  1. 編譯源代碼生成目標(biāo)文件
  • 使用編譯器(如gcc)將源文件編譯為目標(biāo)文件(.o文件)。
gcc -c file1.c -o file1.o  
gcc -c file2.c -o file2.o  
# 以此類推,為所有源文件生成目標(biāo)文件

3.創(chuàng)建頭文件

  • 為庫(kù)函數(shù)創(chuàng)建一個(gè)頭文件(.h文件),聲明庫(kù)文件中的函數(shù)。
  1. 打包目標(biāo)文件
  • 使用歸檔工具(如ar)將多個(gè)目標(biāo)文件打包成一個(gè)靜態(tài)庫(kù)文件(.a文件)。
ar rcs libmylib.a file1.o file2.o  
# 其中l(wèi)ibmylib.a是生成的靜態(tài)庫(kù)文件名,rcs是ar命令的選項(xiàng),
# r表示替換,c表示創(chuàng)建,s表示創(chuàng)建目標(biāo)文件索引
# 查看靜態(tài)庫(kù)中的目錄列表
[root@localhost linux]# ar -tv libmymath.a 

注意事項(xiàng):

  • 靜態(tài)庫(kù)的名字通常以lib開(kāi)頭,以.a結(jié)尾(例如:libmylib.a)。
  • 靜態(tài)庫(kù)在鏈接時(shí)會(huì)被完全嵌入到可執(zhí)行文件中,因此生成的可執(zhí)行文件會(huì)比較大。
  • 如果靜態(tài)庫(kù)更新,使用它的程序需要重新編譯。

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

  1. 引入頭文件
  • 首先,在你的源代碼文件中包含(#include)靜態(tài)庫(kù)提供的頭文件。這些頭文件通常包含庫(kù)中函數(shù)和變量的聲明。
#include "library.h" // 假設(shè)這是靜態(tài)庫(kù)提供的頭文件
  1. 配置編譯器和鏈接器
  • 在編譯你的程序時(shí),需要告訴編譯器在哪里找到靜態(tài)庫(kù)的頭文件,以及告訴鏈接器在哪里找到靜態(tài)庫(kù)的二進(jìn)制文件。這通常通過(guò)編譯器的命令行選項(xiàng)或項(xiàng)目配置設(shè)置來(lái)完成。

編譯器選項(xiàng)(指定頭文件搜索路徑)

  • -I(大寫i)選項(xiàng)用于指定編譯器搜索頭文件的路徑。
gcc -I/path/to/library/headers your_program.c -o your_program

鏈接器選項(xiàng)(指定庫(kù)文件路徑和名稱)

  • -L(大寫L)選項(xiàng)用于指定鏈接器搜索庫(kù)文件的路徑。
  • -l(小寫L)選項(xiàng)用于指定要鏈接的庫(kù)名(注意,不需要庫(kù)文件的前綴lib和后綴.a或.lib)。
gcc your_program.c -L/path/to/library -llibrary -o your_program

在這個(gè)例子中,-llibrary告訴鏈接器鏈接到名為library的庫(kù),鏈接器會(huì)在-L指定的路徑下查找名為liblibrary.a(在Unix系統(tǒng)上)或library.lib(在Windows系統(tǒng)上)的文件。
注意事項(xiàng)和歸納

  • 頭文件和庫(kù)文件的路徑:確保你的編譯器和鏈接器能夠找到靜態(tài)庫(kù)的頭文件和二進(jìn)制文件。這可能需要設(shè)置編譯器和鏈接器的搜索路徑。
  • 庫(kù)名:在鏈接器選項(xiàng)中指定庫(kù)名時(shí),不需要包含lib前綴或文件擴(kuò)展名(如.a或.lib)。
  • 跨平臺(tái)考慮:不同的操作系統(tǒng)和編譯器可能有不同的靜態(tài)庫(kù)文件格式和鏈接選項(xiàng)。例如,Windows上的靜態(tài)庫(kù)通常以.lib為擴(kuò)展名,而Unix系統(tǒng)(如Linux)上的靜態(tài)庫(kù)通常以.a為擴(kuò)展名。
  • 項(xiàng)目配置:如果你在使用集成開(kāi)發(fā)環(huán)境(IDE),如Visual Studio、Xcode或CLion等,你可能需要在項(xiàng)目的配置設(shè)置中指定頭文件和庫(kù)文件的路徑,以及要鏈接的庫(kù)名。
  • 錯(cuò)誤處理:如果在編譯或鏈接過(guò)程中遇到錯(cuò)誤,仔細(xì)檢查編譯器和鏈接器的輸出信息,以確定問(wèn)題的原因。常見(jiàn)的錯(cuò)誤可能包括找不到頭文件、找不到庫(kù)文件、未定義的引用等。

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

什么是動(dòng)態(tài)庫(kù)?
定義
動(dòng)態(tài)庫(kù),又稱為動(dòng)態(tài)鏈接庫(kù)(Dynamic Link Library,簡(jiǎn)稱DLL),在Windows系統(tǒng)中通常以.dll為文件擴(kuò)展名,而在Linux或Unix系統(tǒng)中則通常以.so為文件擴(kuò)展名。動(dòng)態(tài)庫(kù)在程序運(yùn)行時(shí)被加載到內(nèi)存中,與程序進(jìn)行動(dòng)態(tài)鏈接。
特點(diǎn)

  1. 動(dòng)態(tài)加載:動(dòng)態(tài)庫(kù)在程序運(yùn)行時(shí)被加載到內(nèi)存中,而不是在編譯時(shí)。這意味著程序在運(yùn)行時(shí)可以決定是否需要加載某個(gè)動(dòng)態(tài)庫(kù),從而實(shí)現(xiàn)代碼的靈活加載。
  2. 代碼共享:由于動(dòng)態(tài)庫(kù)是存儲(chǔ)在系統(tǒng)的某個(gè)特定位置(如Linux下的/usr/lib或/lib目錄),因此多個(gè)程序可以共享同一個(gè)動(dòng)態(tài)庫(kù)的實(shí)例。這有助于減少內(nèi)存占用,提高系統(tǒng)資源的利用率。
  3. 更新方便:當(dāng)動(dòng)態(tài)庫(kù)更新時(shí),只需要替換舊的動(dòng)態(tài)庫(kù)文件,而無(wú)需重新編譯或鏈接使用它的程序。這使得軟件的更新和維護(hù)變得更加方便。
  4. 函數(shù)導(dǎo)出和調(diào)用:動(dòng)態(tài)庫(kù)通常包含一個(gè)或多個(gè)導(dǎo)出的函數(shù),這些函數(shù)可以被其他程序調(diào)用。通過(guò)動(dòng)態(tài)鏈接,程序可以調(diào)用不屬于其可執(zhí)行代碼的函數(shù),從而實(shí)現(xiàn)代碼的復(fù)用和模塊化。

使用方式
在使用動(dòng)態(tài)庫(kù)時(shí),需要在編譯時(shí)指定動(dòng)態(tài)庫(kù)的接口,而不是將其代碼直接復(fù)制到可執(zhí)行文件中。這意味著在編譯時(shí),編譯器會(huì)生成一個(gè)對(duì)動(dòng)態(tài)庫(kù)接口的引用,而不是將動(dòng)態(tài)庫(kù)的代碼嵌入到可執(zhí)行文件中。在程序運(yùn)行時(shí),操作系統(tǒng)會(huì)根據(jù)這個(gè)引用加載相應(yīng)的動(dòng)態(tài)庫(kù)到內(nèi)存中,并將程序與動(dòng)態(tài)庫(kù)進(jìn)行鏈接。
示例
在Linux系統(tǒng)中,可以使用gcc編譯器和ld鏈接器來(lái)創(chuàng)建和使用動(dòng)態(tài)庫(kù)。首先,通過(guò)gcc編譯器將源文件編譯為目標(biāo)文件(.o文件),并使用-fPIC選項(xiàng)生成位置無(wú)關(guān)的代碼。然后,使用gcc的-shared選項(xiàng)將目標(biāo)文件鏈接為動(dòng)態(tài)庫(kù)(.so文件)。最后,在編譯使用動(dòng)態(tài)庫(kù)的程序時(shí),需要指定動(dòng)態(tài)庫(kù)的接口(即頭文件)和動(dòng)態(tài)庫(kù)文件的路徑(使用-L選項(xiàng)指定路徑,-l選項(xiàng)指定庫(kù)名)。
注意事項(xiàng)

  • 依賴關(guān)系:由于動(dòng)態(tài)庫(kù)是在程序運(yùn)行時(shí)加載的,因此程序需要知道動(dòng)態(tài)庫(kù)的位置和名稱。這通常通過(guò)環(huán)境變量(如LD_LIBRARY_PATH)或系統(tǒng)配置文件(如/etc/ld.so.conf)來(lái)指定。
  • 版本兼容性:不同版本的動(dòng)態(tài)庫(kù)可能具有不同的接口和功能。因此,在更新動(dòng)態(tài)庫(kù)時(shí),需要確保新的動(dòng)態(tài)庫(kù)與程序兼容,否則可能會(huì)導(dǎo)致程序崩潰或功能異常。
  • 安全性:由于動(dòng)態(tài)庫(kù)可以被多個(gè)程序共享,因此需要確保動(dòng)態(tài)庫(kù)的安全性和穩(wěn)定性。不當(dāng)?shù)膭?dòng)態(tài)庫(kù)更新或惡意動(dòng)態(tài)庫(kù)注入可能會(huì)導(dǎo)致系統(tǒng)崩潰或數(shù)據(jù)泄露等安全問(wèn)題。

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

  1. 準(zhǔn)備源文件
    首先,你需要有包含你想要在動(dòng)態(tài)庫(kù)中實(shí)現(xiàn)的函數(shù)和變量的源文件(.c或.cpp文件)。
  2. 編譯為位置無(wú)關(guān)代碼(Position Independent Code, PIC)
    使用GCC編譯器,你需要為源文件生成位置無(wú)關(guān)的代碼(PIC)。這通常通過(guò)使用-fPIC(或-fpic,對(duì)于小模型)選項(xiàng)來(lái)完成。
gcc -c -fPIC source_file.c -o source_file.o

在這里,source_file.c是你的源文件,source_file.o是生成的目標(biāo)文件。
3. 鏈接目標(biāo)文件以生成動(dòng)態(tài)庫(kù)
使用GCC的-shared選項(xiàng),你可以將目標(biāo)文件鏈接成一個(gè)動(dòng)態(tài)庫(kù)。假設(shè)你有一個(gè)或多個(gè)目標(biāo)文件,你可以將它們?nèi)挎溄拥揭粋€(gè)動(dòng)態(tài)庫(kù)中。

gcc -shared -o libmy_library.so source_file1.o source_file2.o ...

在這里,libmy_library.so是你想要生成的動(dòng)態(tài)庫(kù)文件的名字。
歸納
生成動(dòng)態(tài)庫(kù)主要涉及以下幾個(gè)步驟:

  1. 編譯源文件為PIC:使用-fPIC選項(xiàng)編譯源文件為目標(biāo)文件。
  2. 鏈接目標(biāo)文件:使用-shared選項(xiàng)將目標(biāo)文件鏈接為動(dòng)態(tài)庫(kù)。

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

  1. 鏈接庫(kù)文件
  • 在編譯時(shí):將動(dòng)態(tài)庫(kù)文件(如.dll在Windows上,.so在Linux上)的路徑添加到鏈接器的搜索路徑中。這通常通過(guò)編譯器的命令行參數(shù)完成,例如使用-L選項(xiàng)指定庫(kù)文件所在的目錄。
  • 指定庫(kù)名:在鏈接器的命令行參數(shù)中,使用-l選項(xiàng)(小寫L)指定要鏈接的庫(kù)名(注意,不需要包含庫(kù)文件的前綴和后綴)。
  1. 導(dǎo)入函數(shù)
  • 在程序中聲明:聲明需要使用的庫(kù)函數(shù)。這通常通過(guò)包含相應(yīng)的頭文件來(lái)實(shí)現(xiàn),頭文件中包含了函數(shù)的聲明。
  • 鏈接器替換:在編譯時(shí),鏈接器會(huì)使用庫(kù)文件中的函數(shù)實(shí)現(xiàn)替換這些聲明,以便在程序中調(diào)用它們。
  1. 運(yùn)行時(shí)加載庫(kù)
  • 調(diào)用加載函數(shù):在程序運(yùn)行時(shí),通過(guò)調(diào)用操作系統(tǒng)提供的加載庫(kù)函數(shù)來(lái)加載動(dòng)態(tài)庫(kù)。在Windows上,這通常使用LoadLibrary函數(shù);在Linux上,使用dlopen函數(shù)。
  • 指定庫(kù)文件路徑:加載庫(kù)時(shí),需要指定庫(kù)文件的路徑,并獲取一個(gè)句柄或指針,以便后續(xù)使用。
  1. 使用庫(kù)函數(shù)
  • 通過(guò)句柄或指針調(diào)用:一旦庫(kù)文件加載完成,就可以通過(guò)之前獲取的句柄或指針來(lái)調(diào)用庫(kù)函數(shù)了。在Windows上,使用GetProcAddress函數(shù)獲取函數(shù)地址;在Linux上,同樣使用dlsym函數(shù)。
  • 傳遞參數(shù)并處理結(jié)果:調(diào)用庫(kù)函數(shù)時(shí),需要傳遞所需的參數(shù),并處理函數(shù)的執(zhí)行結(jié)果。
  1. 卸載庫(kù)
  • 釋放資源:在程序不再需要使用動(dòng)態(tài)庫(kù)時(shí),應(yīng)該調(diào)用操作系統(tǒng)提供的卸載庫(kù)函數(shù)來(lái)釋放庫(kù)文件所占用的資源。在Windows上,使用FreeLibrary函數(shù);在Linux上,使用dlclose函數(shù)。

歸納
使用動(dòng)態(tài)庫(kù)主要涉及以下幾個(gè)關(guān)鍵步驟:

  1. 鏈接庫(kù)文件:在編譯時(shí)指定庫(kù)文件的路徑和名稱。
  2. 導(dǎo)入函數(shù):在程序中聲明并使用庫(kù)函數(shù)。
  3. 運(yùn)行時(shí)加載庫(kù):在程序運(yùn)行時(shí)加載動(dòng)態(tài)庫(kù)文件,并獲取句柄或指針。
  4. 使用庫(kù)函數(shù):通過(guò)句柄或指針調(diào)用庫(kù)函數(shù),并處理結(jié)果。
  5. 卸載庫(kù):在程序結(jié)束時(shí)釋放庫(kù)文件所占用的資源。

怎么安裝動(dòng)態(tài)庫(kù)?

  1. 直接安裝到系統(tǒng)中

既然在系統(tǒng)默認(rèn)的搜索路徑下找不到我們的庫(kù)文件和頭文件,我們就將它們拷貝到系統(tǒng)的默認(rèn)搜索路徑中。
拷貝頭文件
sudo cp mylib/include/.h /usr/include/
拷貝庫(kù)文件
sudo cp mylib/lib/
.so /lib64

  1. 建立軟連接

ln -s mylib/lib/libmylib.so libmylib.so
刪除當(dāng)前軟鏈接的指令為 rm -rf libmylib.so;如果使用 rm -rf libmylib.so/ 則會(huì)將該軟鏈接指向的目錄全部清空!

  1. 設(shè)置環(huán)境變量

系統(tǒng)在運(yùn)行的時(shí)候會(huì)去幫我們找我們的庫(kù),去哪里找呢?除了系統(tǒng)默認(rèn)庫(kù)路徑下去找,還會(huì)去LD_LIBRARY_PATH 加載庫(kù)的環(huán)境變量中去找!
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/library
但是當(dāng)前這種方法導(dǎo)環(huán)境變量是內(nèi)存級(jí)的,當(dāng)我們退出后重新進(jìn)入它就沒(méi)了

  1. 直接更改系統(tǒng)動(dòng)態(tài)配置文件

在系統(tǒng)中存在一個(gè) /etc/ld.so.conf.d/ 這樣的一個(gè)配置文件目錄,這是系統(tǒng)管理所有系統(tǒng)動(dòng)態(tài)庫(kù)加載相關(guān)的配置文件。
sudo touch /etc/ld.so.conf.d/temp.conf
然后填寫動(dòng)態(tài)庫(kù)的路徑,最后在使用sudo ldconfig刷新

http://m.risenshineclean.com/news/58522.html

相關(guān)文章:

  • 常熟高端網(wǎng)站建設(shè)游戲推廣論壇
  • 廣州免費(fèi)核酸在哪里做臺(tái)州關(guān)鍵詞優(yōu)化服務(wù)
  • 國(guó)內(nèi)互聯(lián)網(wǎng)大廠有哪些站長(zhǎng)工具seo
  • 任丘 做網(wǎng)站免費(fèi)網(wǎng)站流量統(tǒng)計(jì)
  • 學(xué)校網(wǎng)站建設(shè)方案模板下載怎么制作公司網(wǎng)站
  • 網(wǎng)站建設(shè)功能是什么微信軟文案例
  • 慈云寺網(wǎng)站建設(shè)外鏈吧官網(wǎng)
  • 咨詢公司起名用字大全寧波seo關(guān)鍵詞培訓(xùn)
  • 短視頻營(yíng)銷推廣策略上海做網(wǎng)站優(yōu)化
  • 定制網(wǎng)站開(kāi)發(fā)一般多少錢百度搜索官方網(wǎng)站
  • 做粉絲網(wǎng)站會(huì)侵權(quán)嗎如何快速推廣網(wǎng)上國(guó)網(wǎng)
  • 免費(fèi)素材庫(kù)短視頻素材網(wǎng)站互動(dòng)營(yíng)銷名詞解釋
  • 接網(wǎng)站開(kāi)發(fā)的公司電話線上推廣是做什么的
  • 南寧企業(yè)網(wǎng)站建設(shè)包頭整站優(yōu)化
  • 網(wǎng)站建設(shè)上機(jī)考試怎么找一手app推廣代理
  • 網(wǎng)頁(yè)與網(wǎng)站設(shè)計(jì)什么是整體造型如何檢測(cè)網(wǎng)站是否安全
  • 做網(wǎng)站的目的什么網(wǎng)站可以發(fā)布廣告
  • 成都三合一網(wǎng)站建設(shè)蘇州網(wǎng)絡(luò)公司
  • 做網(wǎng)站用的什么服務(wù)器優(yōu)秀企業(yè)網(wǎng)站模板
  • github 可以做網(wǎng)站嗎如何創(chuàng)建網(wǎng)站教程
  • 佛山免費(fèi)網(wǎng)站制作百度排名點(diǎn)擊器
  • 國(guó)外做機(jī)械設(shè)計(jì)任務(wù)的網(wǎng)站求職seo
  • 個(gè)人網(wǎng)站可以做資訊嗎?網(wǎng)絡(luò)推廣課程培訓(xùn)
  • 潁州網(wǎng)站建設(shè)最近新聞?wù)?/a>
  • 優(yōu)惠購(gòu)網(wǎng)站怎么做的青島網(wǎng)站建設(shè)與設(shè)計(jì)制作
  • 佛山做公司網(wǎng)站地推項(xiàng)目平臺(tái)
  • 做動(dòng)態(tài)文字的網(wǎng)站杭州網(wǎng)站定制
  • 做網(wǎng)站建設(shè)的公司有哪些方面建設(shè)網(wǎng)站公司
  • 教育網(wǎng)站如何做seo網(wǎng)絡(luò)運(yùn)營(yíng)團(tuán)隊(duì)
  • 域名怎樣連接到網(wǎng)站外貿(mào)推廣哪個(gè)公司好