chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux-基礎(chǔ)IO解析

xCb1_yikoulinux ? 來(lái)源:一口Linux ? 作者:一口Linux ? 2022-08-11 11:50 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Linux - 基礎(chǔ) IO

  • Linux - 基礎(chǔ) IO

  • 文件 IO 相關(guān)操作

  • stdin & stdout & stderr

  • 系統(tǒng)文件 I/O

文件的宏觀(guān)理解:

狹義理解:

  • 1.文件在磁盤(pán)里
  • 2.磁盤(pán)是永久性存儲(chǔ)介質(zhì),因此文件在磁盤(pán)上的存儲(chǔ)是永久性的
  • 3.磁盤(pán)是外設(shè)(即是輸出設(shè)備也是輸入設(shè)備)
  • 4.磁盤(pán)上的文件 本質(zhì)是對(duì)文件的所有操作,都是對(duì)外設(shè)的輸入和輸出 簡(jiǎn)稱(chēng) IO

廣義理解:

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

文件操作的歸類(lèi)認(rèn)知:

  • 1.對(duì)于 0KB 的空文件是占用磁盤(pán)空間的
  • 2.文件是文件屬性(元數(shù)據(jù))和文件內(nèi)容的集合(文件 = 屬性(元數(shù)據(jù))+ 內(nèi)容)
  • 3.所有的文件操作本質(zhì)是文件內(nèi)容操作和文件屬性操作

系統(tǒng)角度:

  • 1.對(duì)文件的操作本質(zhì)是進(jìn)程對(duì)文件的操作
  • 2.磁盤(pán)的管理者是操作系統(tǒng)
  • 3.文件的讀寫(xiě)本質(zhì)不是通過(guò) C 語(yǔ)言 / C++ 的庫(kù)函數(shù)來(lái)操作的(這些庫(kù)函數(shù)只是為用戶(hù)提供方便),而是通過(guò)文件相關(guān)的系統(tǒng)調(diào)用接口來(lái)實(shí)現(xiàn)的

文件 IO 相關(guān)操作

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

fputs 函數(shù)是將 s 所指向的數(shù)據(jù)往 stream 中所指向的文件中寫(xiě)

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

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

注:

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

fwrite 的使用方法

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

stdin & stdout & stderr

89e3f1b6-1928-11ed-ba43-dac502259ad0.png
  • 任何 C 程序,都默認(rèn)打開(kāi)三個(gè)文件分別叫做標(biāo)準(zhǔn)輸入(stdin)、標(biāo)準(zhǔn)輸出(stdout)、標(biāo)準(zhǔn)錯(cuò)誤(stderr)
  • 標(biāo)準(zhǔn)輸入(stdin)——鍵盤(pán)文件——讀方法(read
  • 標(biāo)準(zhǔn)輸出(stdout)、標(biāo)準(zhǔn)錯(cuò)誤(stderr)——顯示器文件——寫(xiě)方法(write)
  • Linux 下一切皆文件
  • 所有的外設(shè)硬件,本質(zhì)是對(duì)應(yīng)的核心操作無(wú)外乎是 read 和 write(不同的硬件對(duì)應(yīng)的讀寫(xiě)方式是不一樣的)

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

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

系統(tǒng)文件 I/O

open

#include
#include
#include

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

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:只寫(xiě)打開(kāi)
O_RDWR:讀,寫(xiě)打開(kāi)
這三個(gè)常量,必須指定一個(gè)且只能指定一個(gè)
 O_CREAT :若文件不存在,則創(chuàng)建它。需要使用mode選項(xiàng),來(lái)指明新文件的訪(fǎng)問(wèn)權(quán)限
O_APPEND:追加寫(xiě)
返回值:
成功:新打開(kāi)的文件描述符
失敗:-1

注:

  • open 函數(shù)具體使用哪個(gè),和具體應(yīng)用場(chǎng)景相關(guān),如目標(biāo)文件不存在,需要 open 創(chuàng)建,則第三個(gè)參數(shù)表示創(chuàng)建文件的默認(rèn)權(quán)限, 否則,使用兩個(gè)參數(shù)的 open。
  • O_RDONLY、O_WRONLY、O_RDWR…… 這些都是系統(tǒng)定義的宏,這些參數(shù)只占一個(gè) int 整形中的一個(gè)比特位

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

注:write read close lseek…… 與 C 語(yǔ)言文件相關(guān)接口用法類(lèi)似

文件描述符 fd

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

  • 用戶(hù)層看到的 fd 本質(zhì)是系統(tǒng)中維護(hù)進(jìn)程和文件對(duì)應(yīng)關(guān)系的數(shù)組的下標(biāo)
  • 所謂的默認(rèn)打開(kāi)文件,標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)錯(cuò)誤,其實(shí)是由底層系統(tǒng)支持的,默認(rèn)一個(gè)進(jìn)程在運(yùn)行的時(shí)候,就打開(kāi)了 0,1,2
  • 對(duì)于進(jìn)程來(lái)講,對(duì)所有的文件進(jìn)行操作,統(tǒng)一使用一套接口(一組函數(shù)指針),因此在 OS 看來(lái)一切皆文件
8a4b69d6-1928-11ed-ba43-dac502259ad0.png

文件描述符就是從 0 開(kāi)始的小整數(shù)。當(dāng)打開(kāi)文件時(shí),操作系統(tǒng)在內(nèi)存中要?jiǎng)?chuàng)建相應(yīng)的數(shù)據(jù)結(jié)構(gòu)來(lái)描述目標(biāo)文件。于是就有了 file 結(jié)構(gòu)體。表示一個(gè)已經(jīng)打開(kāi)的文件對(duì)象。而進(jìn)程執(zhí)行 open 系統(tǒng)調(diào)用,所以必須讓進(jìn)程和文件關(guān)聯(lián)起來(lái)。每個(gè)進(jìn)程都有一個(gè)指針 files_struct*, 指向一張表 files_struct, 該表最重要的部分就是包涵一個(gè)指針數(shù)組,每個(gè)元素都是一個(gè)指向打開(kāi)文件的指針!所以,本質(zhì)上,文件描述符就是該數(shù)組的下標(biāo)。只要拿著文件描述符,就可以找到對(duì)應(yīng)的文件

補(bǔ)充:

  • 標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤在對(duì)應(yīng)的文件描述符為 0,1,2,對(duì)應(yīng) C 語(yǔ)言層上的是 stdin、stdout、stderr
  • 所有文件,如果要被使用時(shí),首先必須被打開(kāi)
  • 一個(gè)進(jìn)程可以打開(kāi)多個(gè)文件,系統(tǒng)中被打開(kāi)的文件一定有多個(gè),多個(gè)被打開(kāi)的文件,一定要被操作系統(tǒng)管理起來(lái)的(先描述(struct file(包含了目標(biāo)文件的基本操作和部分屬性)),再組織(雙鏈表))
  • 打開(kāi)文件的過(guò)程:先在 fd_array 數(shù)組中找一個(gè)最小的沒(méi)有被使用的數(shù)組下標(biāo)位置,然后把新 open 出的文件的結(jié)構(gòu)體地址填入到數(shù)組中去,對(duì)應(yīng)該地址的下標(biāo)返回給對(duì)應(yīng)的進(jìn)程
  • fd:本質(zhì)是進(jìn)程和文件之間對(duì)應(yīng)關(guān)系的數(shù)組的下標(biāo),有了 fd 就可以找到打開(kāi)文件的所有細(xì)節(jié)

文件描述符的分配規(guī)則

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

總結(jié):

  • 文件描述符的分配規(guī)則:在 files_struct 數(shù)組當(dāng)中,找到當(dāng)前沒(méi)有被使用的
    最小的一個(gè)下標(biāo),作為新的文件描述符
  • Linux 進(jìn)程默認(rèn)情況下會(huì)有 3 個(gè)缺省打開(kāi)的文件描述符,分別是標(biāo)準(zhǔn)輸入 0, 標(biāo)準(zhǔn)輸出 1, 標(biāo)準(zhǔn)錯(cuò)誤 2

重定向

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

8a91ad38-1928-11ed-ba43-dac502259ad0.png補(bǔ)充:程序替換的時(shí)候不會(huì)影響重定向?qū)?yīng)的數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)(程序替換影響的是進(jìn)程虛擬地址空間部分,而重定向影響的是 files_struct 部分)

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

#include
intdup2(intoldfd,intnewfd);

注:

  • newfd 使 oldfd 的一份拷貝,不是拷貝 fd 而是拷貝 fd 對(duì)應(yīng)的 fd_array 數(shù)組中的內(nèi)容
8a9d2834-1928-11ed-ba43-dac502259ad0.png

FILE

因?yàn)?IO 相關(guān)函數(shù)與系統(tǒng)調(diào)用接口對(duì)應(yīng),并且?guī)旌瘮?shù)封裝系統(tǒng)調(diào)用,所以本質(zhì)上,訪(fǎng)問(wèn)文件都是通過(guò) fd 訪(fǎng)問(wèn)的。因此 C 庫(kù)當(dāng)中的 FILE 結(jié)構(gòu)體內(nèi)部,必定封裝了 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
//緩沖區(qū)相關(guān)
/*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

總結(jié):

  • FILE 結(jié)構(gòu)體中包含了 int fileno 的成員(也就是系統(tǒng)上的 fd 文件描述符)
  • fopen、fwrite、fread、fclose 等 f 系列的庫(kù)函數(shù)都是由底層 open、write 、read、close 實(shí)現(xiàn)的,通過(guò) open 的返回值傳給 fileno,從而對(duì)系統(tǒng)調(diào)用函數(shù)進(jìn)行封裝
  • struct FILE 內(nèi)部包含:
  1. 底層對(duì)應(yīng)的文件描述符下標(biāo)
  1. 應(yīng)用層 C 語(yǔ)言提供的緩沖區(qū)數(shù)據(jù)
  • 所謂的默認(rèn)打開(kāi)文件,標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤其實(shí)是由底層系統(tǒng)支持的,默認(rèn)一個(gè)進(jìn)程在運(yùn)行的時(shí)候,就打開(kāi)了 0,1,2
8ac7c800-1928-11ed-ba43-dac502259ad0.png

一般 C 庫(kù)函數(shù)寫(xiě)入文件時(shí)是全緩沖的,而寫(xiě)入顯示器是行緩沖。printf fprintf 等庫(kù)函數(shù)會(huì)自帶緩沖區(qū),當(dāng)發(fā)生重定向到普通文件時(shí),數(shù)據(jù)的緩沖方式由行緩沖變成了全緩沖。而我們放在緩沖區(qū)中的數(shù)據(jù),就不會(huì)被立即刷新,甚至 fork 之后但是進(jìn)程退出之后,會(huì)統(tǒng)一刷新,寫(xiě)入文件當(dāng)中。但是 fork 的時(shí)候,父子數(shù)據(jù)會(huì)發(fā)生寫(xiě)時(shí)拷貝,所以當(dāng)你父進(jìn)程準(zhǔn)備刷新的時(shí)候,子進(jìn)程也就有了同樣的一份數(shù)據(jù),隨即產(chǎn)生兩份數(shù)據(jù)。write 沒(méi)有變化,說(shuō)明沒(méi)有所謂的緩沖
printf fputs 等 庫(kù)函數(shù)會(huì)自帶緩沖區(qū),而 write 系統(tǒng)調(diào)用沒(méi)有帶緩沖區(qū)。另外,我們這里所說(shuō)的緩沖區(qū),都是用戶(hù)級(jí)緩沖區(qū)。其實(shí)為了提升整機(jī)性能,OS 也會(huì)提供相關(guān)內(nèi)核級(jí)緩沖區(qū)。printf fprintf 是庫(kù)函數(shù), write 是系統(tǒng)調(diào)用,庫(kù)函數(shù)在系統(tǒng)調(diào)用的 “上層”, 是對(duì)系統(tǒng)調(diào)用的 “封裝”,但是 write 有內(nèi)核級(jí)緩沖區(qū),而 printf fwrite fputs 等緩沖區(qū)是用戶(hù)級(jí)緩沖區(qū),由 C 標(biāo)準(zhǔn)庫(kù)提供

注:系統(tǒng)調(diào)用函數(shù)與庫(kù)函數(shù)盡量不要混在一起使用,可能會(huì)與統(tǒng)一使用的函數(shù)的運(yùn)行結(jié)果有所差異

文件系統(tǒng)

文件:打開(kāi)的文件、普通未打開(kāi)的文件
打開(kāi)的文件:屬性與操作方法的表現(xiàn)就是 struct file{} 屬于內(nèi)存級(jí)文件
普通未打開(kāi)的文件:磁盤(pán)上面未被加載到內(nèi)存的
文件系統(tǒng)功能:將上述的這些文件管理起來(lái)

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

磁盤(pán)

磁盤(pán)是計(jì)算機(jī)主要的存儲(chǔ)介質(zhì),可以存儲(chǔ)大量的二進(jìn)制數(shù)據(jù),并且斷電后也能保持?jǐn)?shù)據(jù)不丟失。早期計(jì)算機(jī)使用的磁盤(pán)是軟磁盤(pán)(Floppy Disk,簡(jiǎn)稱(chēng)軟盤(pán)),如今常用的磁盤(pán)是硬磁盤(pán)(Hard disk,簡(jiǎn)稱(chēng)硬盤(pán))。

8aeb0176-1928-11ed-ba43-dac502259ad0.png補(bǔ)充:

  • 內(nèi)存在操作系統(tǒng)的角度使用的時(shí)候,基本單位是 4KB,但在使用角度是 1 字節(jié)
  • 磁盤(pán)存儲(chǔ)的基本單位是扇區(qū)(512 字節(jié))(磁盤(pán)讀取的最小單元)
  • 內(nèi)存與磁盤(pán)間 IO 時(shí),基本單位是 4KB,是通過(guò)文件系統(tǒng)來(lái)完成的

磁盤(pán)的劃分

我們可以將磁盤(pán)想象成磁帶(線(xiàn)性結(jié)構(gòu)),將磁盤(pán)看成一個(gè)線(xiàn)性空間(數(shù)組),類(lèi)型為扇區(qū)的數(shù)組、數(shù)組個(gè)數(shù)為 10 億多

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

這樣劃分就不用讓 OS 讀取數(shù)據(jù)時(shí)在哪個(gè)盤(pán)面、哪個(gè)磁道、哪個(gè)扇區(qū)找了,OS 與磁盤(pán)映射關(guān)系可以通過(guò)磁盤(pán)驅(qū)動(dòng)來(lái)完成,這樣也就做到強(qiáng)解耦性。無(wú)論換機(jī)械硬盤(pán)還是固態(tài)硬盤(pán),OS 都不用改變讀取磁盤(pán)數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),只需改變磁盤(pán)的驅(qū)動(dòng)程序即可

注:操作系統(tǒng)讀取磁盤(pán)數(shù)據(jù)時(shí)的下標(biāo)——LBA

  • 磁盤(pán)經(jīng)過(guò)在 OS 中的虛擬化成數(shù)組,但是所占空間太大,因此需要進(jìn)行分區(qū)化管理,并對(duì)該區(qū)域進(jìn)行格式化(寫(xiě)入文件系統(tǒng)(數(shù)據(jù)和方法))。eg:Windows 中的 C 盤(pán)、D 盤(pán)……
  • 每個(gè)分區(qū)再進(jìn)行分組——塊組
  • Linux 系統(tǒng)下支持多種文件系統(tǒng):Ext2、Ext3、fs、usb-fs、sysfs、proc

inode

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

Linux ext2 文件系統(tǒng),上圖為磁盤(pán)文件系統(tǒng)圖(內(nèi)核內(nèi)存映像肯定有所不同),磁盤(pán)是典型的塊設(shè)備,硬盤(pán)分區(qū)被劃分為一個(gè)個(gè)的 block。一個(gè) block 的大小是由格式化的時(shí)候確定的,并且不可以更改。例如 mke2fs 的 - b 選項(xiàng)可以設(shè) 定 block 大小為 1024、2048 或 4096 字節(jié)。而啟動(dòng)塊(Boot Block)的大小是確定的,

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

注:

  • Block Group 每個(gè)塊組中都有,但是 Super Block 并不是每個(gè)塊組中都有
  • 每一個(gè)文件都對(duì)應(yīng)一個(gè) inode 節(jié)點(diǎn)

總結(jié):

  • 基本上,一個(gè)文件一個(gè) inode(包括文件)
  • inode 是一個(gè)文件的所有的屬性集合(不包含文件名)(空文件也是占據(jù)空間的,所有的屬性也是數(shù)據(jù)也要占據(jù)空間)
  • 真正表示文件的不是文件名,而是文件的 inode 編號(hào)
  • inode 是可以和特定的數(shù)據(jù)塊產(chǎn)生關(guān)聯(lián)的
  • 程序員是通過(guò)路徑定位的(目錄)來(lái)定位一個(gè)文件,而操作系統(tǒng)是通過(guò)目錄的 Data blocks 來(lái)確定文件名和 inode 的映射關(guān)系
  • 目錄是文件,有獨(dú)立的 inode 和數(shù)據(jù)塊

創(chuàng)建一個(gè)新文件主要有一下 4 個(gè)操作:

  • 1.存儲(chǔ)屬性 ——內(nèi)核先找到一個(gè)空閑的 i 節(jié)點(diǎn)。內(nèi)核把文件信息記錄到其中。
  • 2.存儲(chǔ)數(shù)據(jù) ——該文件需要存儲(chǔ)在三個(gè)磁盤(pán)塊,內(nèi)核找到了三個(gè)空閑塊。將內(nèi)核緩沖區(qū)數(shù)據(jù)緩沖到磁盤(pán)的數(shù)據(jù)區(qū)中
  • 3.記錄分配情況——文件內(nèi)容按順序存放(數(shù)據(jù)塊)。內(nèi)核在 inode 上的磁盤(pán)分布區(qū)記錄了上述塊列表。
  • 4.添加文件名到目錄——內(nèi)核將入口添加到目錄文件。文件名和 inode 之間的對(duì)應(yīng)關(guān)系將文件名和文件的內(nèi)容及屬性連接起來(lái)。

大多是操作系統(tǒng)在同一個(gè)目錄下是不允許存在同名文件的 刪除文件不需要清空該文件占據(jù)的所有的空間數(shù)據(jù)(只需將該文件的 inode 和對(duì)應(yīng)的數(shù)據(jù)塊無(wú)效化即可(文件對(duì)應(yīng) inode 和 Block 位圖中的數(shù)字 1 設(shè)置為 0,并將該文件所對(duì)應(yīng)的目錄中的數(shù)據(jù)塊的關(guān)于該文件內(nèi)容清空即可) Linux 下屬性和內(nèi)容是分離的,屬性 inode 保存的(在同一塊塊組 inode 編號(hào)是不同的,但是跨組的 inode 編號(hào)可能相同),內(nèi)容 Data blocks 保存的

補(bǔ)充:

  • inode 描述了文件大小和指向數(shù)據(jù)塊的指針
  • 通過(guò) inode 可獲得文件占用的塊數(shù)
  • 通過(guò) inode 可實(shí)現(xiàn)文件的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)的轉(zhuǎn)換

軟硬連接

硬鏈接:
8b37da14-1928-11ed-ba43-dac502259ad0.png硬鏈接的應(yīng)用場(chǎng)景:方便進(jìn)行相對(duì)路徑的路徑的設(shè)置
8b4bc664-1928-11ed-ba43-dac502259ad0.png

8b6283ea-1928-11ed-ba43-dac502259ad0.png因此,可以看出.、… 的底層實(shí)現(xiàn)是通過(guò)硬鏈接的方式來(lái)實(shí)現(xiàn)的
注:

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

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

總結(jié):軟硬鏈接的區(qū)別:本質(zhì)是是否是獨(dú)立文件,有無(wú)獨(dú)立 inode;用途:軟鏈接可以指向特定的文件方便進(jìn)行快速索引,硬鏈接是能進(jìn)行相對(duì)路徑設(shè)置

補(bǔ)充:

  • 軟鏈接文件是一個(gè)獨(dú)立的文件有自己的 inode 節(jié)點(diǎn),通過(guò)數(shù)據(jù)中保存的源文件路徑訪(fǎng)問(wèn)源文件
  • 硬鏈接是文件的一個(gè)目錄項(xiàng),與源文件共用同一個(gè) inode 節(jié)點(diǎn),直接通過(guò)自己的 inode 節(jié)點(diǎn)訪(fǎng)問(wèn)源文件
  • 不同分區(qū)有可能有不同文件系統(tǒng),因此硬鏈接不能跨分區(qū)建立;軟連接可以跨文件系統(tǒng)進(jìn)行連接,硬鏈接不可以
  • 當(dāng)刪除源文件時(shí),軟鏈接文件失效
  • ln 生成符號(hào)鏈接文件指的是 ln -s 生成軟鏈接文件

文件的 ACM

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

總結(jié):

  • Access 最后訪(fǎng)問(wèn)時(shí)間
  • Modify 文件內(nèi)容最后修改時(shí)間
  • Change 屬性最后修改時(shí)間

文件的 ACM 的應(yīng)用場(chǎng)景:
8bd59240-1928-11ed-ba43-dac502259ad0.png

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

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

  • 使用頂尖的工程師寫(xiě)的代碼是為了開(kāi)發(fā)效率和魯棒性(健壯性)
  • 使用頂尖的工程師寫(xiě)的功能一般通過(guò)庫(kù)、開(kāi)源代碼、基本的網(wǎng)絡(luò)功能調(diào)用(各種網(wǎng)絡(luò)接口、語(yǔ)音識(shí)別
  • 庫(kù)分為動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)
  • 庫(kù)的命名:取消前綴 lib,去掉. 之后的內(nèi)容,剩下的就是庫(kù)的名字
  • 生成可執(zhí)行程序的方式有兩種:動(dòng)態(tài)鏈接、靜態(tài)鏈接

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

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

總結(jié):

  • 靜態(tài)庫(kù)(.a):程序在編譯鏈接的時(shí)候把庫(kù)的代碼鏈接到可執(zhí)行文件中。程序運(yùn)行的時(shí)候?qū)⒉辉傩枰o態(tài)庫(kù)
  • 動(dòng)態(tài)庫(kù)(.so):程序在運(yùn)行的時(shí)候才去鏈接動(dòng)態(tài)庫(kù)的代碼,多個(gè)程序共享使用庫(kù)的代碼。
  • 一個(gè)與動(dòng)態(tài)庫(kù)鏈接的可執(zhí)行文件僅僅包含它用到的函數(shù)入口地址的一個(gè)表,而不是外部函數(shù)所在目標(biāo)文件的整個(gè)機(jī)器碼
  • 在可執(zhí)行文件開(kāi)始運(yùn)行以前,外部函數(shù)的機(jī)器碼由操作系統(tǒng)從磁盤(pán)上的該動(dòng)態(tài)庫(kù)中復(fù)制到內(nèi)存中,這個(gè)過(guò)程稱(chēng)為動(dòng)態(tài)鏈接(dynamic linking)
  • 動(dòng)態(tài)庫(kù)可以在多個(gè)程序間共享,所以動(dòng)態(tài)鏈接使得可執(zhí)行文件更小,節(jié)省了磁盤(pán)空間。操作系統(tǒng)采用虛擬內(nèi)存機(jī)制允許物理內(nèi)存中的一份動(dòng)態(tài)庫(kù)被要用到該庫(kù)的所有進(jìn)程共用,節(jié)省了內(nèi)存和磁盤(pán)空間

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

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

注:

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

C 語(yǔ)言編譯時(shí)直接編譯不用任何選項(xiàng):

  • 1.庫(kù)文件和頭文件在默認(rèn)路徑下 gcc 能找到
  • 2.gcc 編譯 C 語(yǔ)言代碼默認(rèn)應(yīng)該鏈接 libc

當(dāng)自己的可執(zhí)行程序編譯時(shí)不想用這些選項(xiàng):將頭文件和庫(kù)文件分別拷貝到默認(rèn)路徑下——庫(kù)的安裝(第三方庫(kù))(使用時(shí)必須帶上 - l 庫(kù)名稱(chēng)) 當(dāng)只有靜態(tài)庫(kù)時(shí),沒(méi)有動(dòng)態(tài)庫(kù),用 gcc 編譯(不加 - static)會(huì)直接用靜態(tài)鏈接生成可執(zhí)行程序

補(bǔ)充:

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

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

  • shared: 表示生成共享庫(kù)格式
  • fPIC:產(chǎn)生位置無(wú)關(guān)碼 (position independent code)
  • 庫(kù)名規(guī)則:libxxx.so
    8c49f248-1928-11ed-ba43-dac502259ad0.png

補(bǔ)充:

  • 動(dòng)態(tài)庫(kù)被加載在內(nèi)存中,可以供多個(gè)使用庫(kù)的程序共享映射到自己的虛擬地址空間使用,因此可以減少頁(yè)面交換以及降低內(nèi)存中代碼冗余,并且因?yàn)榕c源程序模塊分離,因此開(kāi)發(fā)模式比較好
  • 加載動(dòng)態(tài)庫(kù)的程序運(yùn)行速度相對(duì)較慢,因?yàn)閯?dòng)態(tài)庫(kù)運(yùn)行時(shí)加載,映射到虛擬地址空間后需要重新根據(jù)映射起始地址計(jì)算函數(shù) / 變量地址
  • 靜態(tài)庫(kù)會(huì)被添加為程序的一部分進(jìn)行使用
  • 動(dòng)態(tài)庫(kù)可用節(jié)省內(nèi)存和磁盤(pán)空間
  • 靜態(tài)庫(kù)重新編譯,需要將應(yīng)用程序重新編譯

運(yùn)行動(dòng)態(tài)庫(kù)

1.拷貝. so 文件到系統(tǒng)共享庫(kù)路徑下, 一般指 / usr/lib

2.更改 LD_LIBRARY_PATH(當(dāng)系統(tǒng)重啟時(shí)使用之前添加的是無(wú)效的,應(yīng)重新添加)

exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:路徑

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

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

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11681

    瀏覽量

    218581
  • 磁盤(pán)
    +關(guān)注

    關(guān)注

    1

    文章

    394

    瀏覽量

    26361
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2123

    瀏覽量

    76873
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    全面解析CCE4511:4通道IO-Link主站PHY的卓越之選

    全面解析CCE4511:4通道IO-Link主站PHY的卓越之選 在工業(yè)自動(dòng)化的浪潮中,IO-Link標(biāo)準(zhǔn)的應(yīng)用愈發(fā)廣泛,它為設(shè)備間的通信提供了高效、穩(wěn)定的解決方案。而CCE4511作為一款高性能
    的頭像 發(fā)表于 12-26 18:10 ?989次閱讀

    主板到IO板連接線(xiàn)核心技術(shù)與方案解析

    一、主板到IO板連接線(xiàn)核心技術(shù)與雙品電子FFCSP方案解析1.1核心定義與主要功能主板到IO板連接線(xiàn)(又稱(chēng)板對(duì)板互連線(xiàn)纜),是連接電子設(shè)備主板與IO接口板的柔性/剛性傳輸載體,核心功能
    的頭像 發(fā)表于 12-24 17:53 ?147次閱讀
    主板到<b class='flag-5'>IO</b>板連接線(xiàn)核心技術(shù)與方案<b class='flag-5'>解析</b>

    具有集成浪涌保護(hù)功能的TIOL111、TIOL111x IO-Link器件收發(fā)器:功能與應(yīng)用解析

    具有集成浪涌保護(hù)功能的TIOL111、TIOL111x IO-Link器件收發(fā)器:功能與應(yīng)用解析 在工業(yè)自動(dòng)化領(lǐng)域,高效可靠的通信與控制至關(guān)重要。TIOL111、TIOL1113、TIOL1115
    的頭像 發(fā)表于 12-18 17:10 ?531次閱讀

    小型封裝、高性能的TIOL112和TIOL112x IO-Link器件收發(fā)器解析

    小型封裝、高性能的TIOL112和TIOL112x IO-Link器件收發(fā)器解析 在工業(yè)自動(dòng)化和過(guò)程自動(dòng)化領(lǐng)域,IO-Link技術(shù)正發(fā)揮著越來(lái)越重要的作用。TI推出的TIOL112和TIOL112x
    的頭像 發(fā)表于 12-16 15:45 ?286次閱讀

    深入解析TIOL221:具有集成LDO和SPI的雙通道IO - Link器件PHY

    深入解析TIOL221:具有集成LDO和SPI的雙通道IO - Link器件PHY 引言 在工業(yè)自動(dòng)化和過(guò)程控制等領(lǐng)域,數(shù)據(jù)通信和信號(hào)傳輸?shù)姆€(wěn)定性與高效性至關(guān)重要。TIOL221作為一款具有集成
    的頭像 發(fā)表于 12-15 15:50 ?532次閱讀

    深入解析IPM器件數(shù)據(jù)手冊(cè)中的電流定義:Ic、Icp、Io(peak)和Io(rms)

    在設(shè)計(jì)和應(yīng)用IPM器件時(shí),電流參數(shù)是影響性能的關(guān)鍵指標(biāo)之一。然而,不同電流參數(shù)的含義可能會(huì)對(duì)應(yīng)用設(shè)計(jì)產(chǎn)生重要影響。本文將詳細(xì)解析IPM數(shù)據(jù)手冊(cè)中常見(jiàn)的幾種電流定義,包括IC、ICP、IO(peak
    的頭像 發(fā)表于 12-03 17:07 ?6921次閱讀
    深入<b class='flag-5'>解析</b>IPM器件數(shù)據(jù)手冊(cè)中的電流定義:Ic、Icp、<b class='flag-5'>Io</b>(peak)和<b class='flag-5'>Io</b>(rms)

    STM32 Nucleo IO-Link開(kāi)發(fā)套件技術(shù)解析

    適用于IO-Link的STMicroelectronics P-NUCLEO-IOD5A1 Nucleo套件由堆疊在NUCLEOG071RB開(kāi)發(fā)板上的X-NUCLEOIOD02A1
    的頭像 發(fā)表于 10-16 10:01 ?603次閱讀
    STM32 Nucleo <b class='flag-5'>IO</b>-Link開(kāi)發(fā)套件技術(shù)<b class='flag-5'>解析</b>

    GraniStudio:IO寫(xiě)入例程

    1.文件運(yùn)行 導(dǎo)入工程 雙擊運(yùn)行桌面GraniStudio.exe。 通過(guò)引導(dǎo)界面導(dǎo)入IO寫(xiě)入例程,點(diǎn)擊導(dǎo)入按鈕。 打開(kāi)IO寫(xiě)入例程所在路徑,選中IO寫(xiě)入.gsp文件,點(diǎn)擊打開(kāi),完成導(dǎo)入。 2.功能
    的頭像 發(fā)表于 08-22 16:47 ?693次閱讀
    GraniStudio:<b class='flag-5'>IO</b>寫(xiě)入例程

    Linux權(quán)限體系解析

    你真的了解Linux權(quán)限嗎?大多數(shù)人只知道rwx,但Linux的權(quán)限體系遠(yuǎn)比你想象的復(fù)雜和強(qiáng)大。今天我們深入探討Linux的12位權(quán)限體系,這是每個(gè)運(yùn)維工程師都應(yīng)該掌握的核心知識(shí)。
    的頭像 發(fā)表于 07-23 16:57 ?751次閱讀

    一文掌握Linux命令

    作為一名運(yùn)維工程師,熟練掌握Linux命令是基本功中的基本功。無(wú)論是日常工作中的系統(tǒng)維護(hù),還是面試時(shí)的技術(shù)考核,Linux命令都是繞不開(kāi)的核心技能。本文將從實(shí)戰(zhàn)角度出發(fā),系統(tǒng)梳理運(yùn)維工程師必須掌握的Linux命令,并結(jié)合實(shí)際場(chǎng)景
    的頭像 發(fā)表于 07-22 15:23 ?532次閱讀

    2025年遠(yuǎn)程IO模塊選購(gòu)指南:主流品牌優(yōu)勢(shì)與應(yīng)用方案解析

    監(jiān)控、管理和優(yōu)化。在2025年,遠(yuǎn)程IO模塊市場(chǎng)技術(shù)創(chuàng)新不斷,各大品牌推出了多種性能卓越的產(chǎn)品,適用于工業(yè)生產(chǎn)、能源管理、智慧城市等多種場(chǎng)景。本文基于權(quán)威數(shù)據(jù)平臺(tái)(如Statista、MarketsandMarkets和Grand View Research)的市場(chǎng)分析,深入解析
    的頭像 發(fā)表于 07-04 17:54 ?726次閱讀

    Analog Devices / Maxim Integrated MAXREFDES177 IO-Link通用模擬IO特性/框圖

    Analog Devices MAXREFDES177 IO-Link通用模擬IO是一款完備的IO-Link?通用模擬輸入-輸出 (IO) 參考設(shè)計(jì),采用內(nèi)置集成保護(hù)功能的MAX225
    的頭像 發(fā)表于 06-30 09:30 ?670次閱讀
    Analog Devices / Maxim Integrated MAXREFDES177 <b class='flag-5'>IO</b>-Link通用模擬<b class='flag-5'>IO</b>特性/框圖

    分布式IO模組選購(gòu)指南:2025主流品牌盤(pán)點(diǎn)與應(yīng)用方案解析

    ,分布式IO模塊市場(chǎng)進(jìn)入快速增長(zhǎng)期。本文基于權(quán)威數(shù)據(jù)平臺(tái)的市場(chǎng)分析,盤(pán)點(diǎn)2025年主流分布式IO模塊品牌,介紹優(yōu)勢(shì)產(chǎn)品,并解析典型應(yīng)用方案,旨在為企業(yè)選購(gòu)提供權(quán)威參考。
    的頭像 發(fā)表于 06-10 16:57 ?1102次閱讀

    深度解析Linux中的DNS服務(wù)

    dns,Domain Name Server,它的作用是將域名解析為 IP 地址,或者將IP地址解析為域名。
    的頭像 發(fā)表于 04-09 16:13 ?772次閱讀

    有獎(jiǎng)直播 | @3/20 IO-Link:開(kāi)啟工業(yè)新時(shí)代的智能工業(yè)之旅

    工業(yè)自動(dòng)化新風(fēng)向!#IO-Link#技術(shù)正在重新定義智能制造!你知道它如何助力工業(yè)4.0嗎?3月20日,大聯(lián)大友尚集團(tuán)攜手意法半導(dǎo)體資深專(zhuān)家和IO-Link設(shè)計(jì)公司,做客#大大通直播間#,帶你深度解析
    的頭像 發(fā)表于 03-13 16:34 ?539次閱讀
    有獎(jiǎng)直播 | @3/20 <b class='flag-5'>IO</b>-Link:開(kāi)啟工業(yè)新時(shí)代的智能工業(yè)之旅