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

文件IO_文件讀寫(附Linux-5.15.10內(nèi)核源碼分析)

這篇具有很好參考價(jià)值的文章主要介紹了文件IO_文件讀寫(附Linux-5.15.10內(nèi)核源碼分析)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

1.什么是文件偏移量?

1.1 文件偏移量介紹

1.2 文件偏移量重點(diǎn)

1.3 文件偏移量工作原理

2.文件偏移量設(shè)置

2.1 lseek函數(shù)

2.2?lseek內(nèi)核源碼分析

3.寫文件

3.1 write函數(shù)

3.2 write內(nèi)核源碼分析

4.讀文件

4.1 read函數(shù)

4.2 read內(nèi)核源碼分析

5.文件讀寫,文件偏移量設(shè)置示例代碼


1.什么是文件偏移量?

1.1 文件偏移量介紹

在介紹文件偏移量之前,先來(lái)喊一個(gè)口號(hào):只有真正理解了文件偏移量,你才會(huì)懂得文件讀寫。

文件偏移量是指文件中當(dāng)前讀取或?qū)懭胛恢玫闹甘酒鳌?/p>

在Linux中,每個(gè)打開的文件都有一個(gè)文件偏移量,用于記錄下一次讀取或?qū)懭氩僮鲗⒃谖募邪l(fā)生的位置。文件偏移量是一個(gè)以字節(jié)為單位的整數(shù)值,從文件開頭開始計(jì)算。

當(dāng)執(zhí)行讀取或?qū)懭氩僮鲿r(shí),文件偏移量會(huì)隨之改變。

  • 讀取操作會(huì)從文件偏移量所指示的位置開始讀取數(shù)據(jù),并將文件偏移量向后移動(dòng)到讀取操作結(jié)束后的位置。
  • 寫入操作則會(huì)從文件偏移量所指示的位置開始寫入數(shù)據(jù),并將文件偏移量向后移動(dòng)到寫入操作結(jié)束后的位置。
  • 通過(guò)改變文件偏移量,可以在文件中定位到特定的位置進(jìn)行讀取或?qū)懭氩僮鳌?/li>

1.2 文件偏移量重點(diǎn)

關(guān)于文件偏移量我們需要注意以下幾點(diǎn),只有充分掌握了以下幾點(diǎn)才能進(jìn)行正確的文件讀寫:

  • 1.文件偏移量對(duì)應(yīng)的是struct file對(duì)象的f_pos成員,這個(gè)成員由write,read,lseek函數(shù)共享,也就是說(shuō)三個(gè)函數(shù)都會(huì)改變f_pos值。
  • 2.open函數(shù)如果設(shè)置O_APPEND標(biāo)識(shí),會(huì)改變write函數(shù)使用f_pos的行為,具體可以參考write內(nèi)核源碼分析。

1.3 文件偏移量工作原理

(1)正常情況下文件偏移量工作原理

文件IO_文件讀寫(附Linux-5.15.10內(nèi)核源碼分析),Linux環(huán)境編程,linux,物聯(lián)網(wǎng),c語(yǔ)言,vim,tcp/ip

?圖 1-1 正常情況下文件偏移量工作原理

(2)設(shè)置O_APPEND情況下文件偏移工作原理

文件IO_文件讀寫(附Linux-5.15.10內(nèi)核源碼分析),Linux環(huán)境編程,linux,物聯(lián)網(wǎng),c語(yǔ)言,vim,tcp/ip

?圖 1-2?設(shè)置O_APPEND情況下文件偏移工作原理

2.文件偏移量設(shè)置

2.1 lseek函數(shù)

#include <sys/types.h>
#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);

函數(shù)簡(jiǎn)介:lseek函數(shù)是Linux系統(tǒng)中的一個(gè)文件操作函數(shù),用于改變文件讀寫指針的位置。它可以在文件中任意移動(dòng)讀寫指針,實(shí)現(xiàn)對(duì)文件的隨機(jī)訪問(wèn)。

函數(shù)參數(shù):

fd:文件描述符,指定要進(jìn)行操作的文件。

offset:偏移量,指定要移動(dòng)的字節(jié)數(shù)。正值表示向文件末尾方向移動(dòng),負(fù)值表示向文件起始位置方向移動(dòng)。

whence:起始位置,指定了偏移量的參考位置。它可以取以下三個(gè)值:

  • SEEK_SET:從文件起始位置開始計(jì)算偏移量。
  • SEEK_CUR:從當(dāng)前讀寫指針位置開始計(jì)算偏移量。
  • SEEK_END:從文件末尾位置開始計(jì)算偏移量。

lseek參數(shù)解析:

文件IO_文件讀寫(附Linux-5.15.10內(nèi)核源碼分析),Linux環(huán)境編程,linux,物聯(lián)網(wǎng),c語(yǔ)言,vim,tcp/ip

圖 2-1 lseek參數(shù)解析

函數(shù)返回值:

成功:返回新的讀寫指針位置。

失?。悍祷?1,并設(shè)置errno。

2.2?lseek內(nèi)核源碼分析

文件IO_文件讀寫(附Linux-5.15.10內(nèi)核源碼分析),Linux環(huán)境編程,linux,物聯(lián)網(wǎng),c語(yǔ)言,vim,tcp/ip

?圖 2-2 lseek內(nèi)核源碼分析

lseek內(nèi)核源碼主要流程如圖 2-2,lseek函數(shù)主要工作為更新struct file對(duì)象成員f_ops,Linux一切皆文件,不同的文件類型對(duì)應(yīng)的lseek函數(shù)具體實(shí)現(xiàn)會(huì)不一樣。

lseek,write,read調(diào)用完主要流程都要執(zhí)行f.file->f_pos = pos更新f_pos的值。

3.寫文件

3.1 write函數(shù)

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);

函數(shù)簡(jiǎn)介:用于將數(shù)據(jù)寫入文件描述符或設(shè)備。

函數(shù)參數(shù):

fd:文件描述符,要寫入的文件或設(shè)備的標(biāo)符。通常使用open函數(shù)打開文件或設(shè)備后返回的文件描述符作為參數(shù)。

buf:要寫入數(shù)據(jù)的緩沖區(qū)的指針,數(shù)據(jù)將該緩沖區(qū)寫入到文件描述符指定的位置。

count:要寫入的字節(jié)數(shù),即從緩沖區(qū)中寫入的數(shù)據(jù)長(zhǎng)度。

函數(shù)返回值:

成功:返回實(shí)際寫入的字節(jié)數(shù)。

失?。悍祷?1,并設(shè)置errno。

3.2 write內(nèi)核源碼分析

文件IO_文件讀寫(附Linux-5.15.10內(nèi)核源碼分析),Linux環(huán)境編程,linux,物聯(lián)網(wǎng),c語(yǔ)言,vim,tcp/ip

?圖 3-1?write函數(shù)內(nèi)核源碼分析

write函數(shù)內(nèi)核源碼主要流程如圖 3-1,write函數(shù)主要工作為將數(shù)據(jù)寫入文件并更新更新struct file對(duì)象成員f_ops,不同的文件類型對(duì)應(yīng)的write函數(shù)實(shí)現(xiàn)會(huì)不一樣,需要具體情況具體分析。

write函數(shù)有一個(gè)重點(diǎn)就是當(dāng)open函數(shù)設(shè)置O_APPEND標(biāo)識(shí)后,write每次寫數(shù)據(jù)都是從隊(duì)尾開始,這個(gè)特性的實(shí)現(xiàn)是write不會(huì)用struct file對(duì)象成員f_pos指定的位置開始寫文件,而是重新計(jì)算pos(設(shè)置為文件實(shí)際大?。褂胮os指定的位置開始寫文件,根據(jù)內(nèi)核源碼,我們就能很清楚理解O_APPEND標(biāo)識(shí)工作原理。

4.讀文件

4.1 read函數(shù)

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

函數(shù)簡(jiǎn)介:用于從文件描述符中讀取數(shù)據(jù)。

函數(shù)參數(shù):

fd:文件描述符,要讀取的文件或設(shè)備的標(biāo)識(shí)符。通常使用open函數(shù)打開文件或設(shè)備后返回的文件描述符作為參數(shù)。

buf:存放讀取數(shù)據(jù)的緩沖區(qū)的指針。數(shù)據(jù)將從文件描述符指定的位置讀取到該緩沖區(qū)。

count:要讀取的字節(jié)數(shù),即從文件中讀取的數(shù)據(jù)長(zhǎng)度。

函數(shù)返回值:

成功:返回實(shí)際讀取的字節(jié)數(shù)。

失?。悍祷?1,并設(shè)置errno。

4.2 read內(nèi)核源碼分析

文件IO_文件讀寫(附Linux-5.15.10內(nèi)核源碼分析),Linux環(huán)境編程,linux,物聯(lián)網(wǎng),c語(yǔ)言,vim,tcp/ip

?圖 4-1 read函數(shù)內(nèi)核源碼分析

read函數(shù)內(nèi)核源碼主要流程如圖 4-1,read函數(shù)主要工作為從文件讀取并更新更新struct file對(duì)象成員f_ops,不同的文件類型對(duì)應(yīng)的read函數(shù)實(shí)現(xiàn)會(huì)不一樣,需要具體情況具體分析。

5.文件讀寫,文件偏移量設(shè)置示例代碼

本示例模擬圖 1-1和圖 1-2 流程文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-571919.html

#include <sys/types.h>
#include <sys/stat.h>
#include <stdbool.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

#define TEST_FILE "/tmp/test.txt"
#define BUF_SIZE (256)
#define READ_BUF_SIZE (2048)

void print_pos(int fd) {
    int pos = lseek(fd, 0, SEEK_CUR);
    printf("cur pos:%d\n", pos);
}

int write_len_data(int fd, unsigned char len, char ch) {
    unsigned char sbuf[BUF_SIZE] = {0};
    for (unsigned char i = 0; i < len; i++) {
        sbuf[i] = ch;
    }

    int ret = write(fd, sbuf, len);
    if (ret == -1) {
        perror("write error");
        return -1;
    }
    return 0;
}

int read_len_data(int fd, unsigned int len) {
    if (len > READ_BUF_SIZE) return -1;
    char rbuf[READ_BUF_SIZE] = {0};
    return read(fd, rbuf, len);
}


int fpos_test(bool append) {
    int flags = 0;
    if (append) {
        flags = O_RDWR | O_CREAT | O_TRUNC | O_APPEND;
    } else {
        flags = O_RDWR | O_CREAT | O_TRUNC;
    }
    int fd = open(TEST_FILE, flags, 0777);
    if (fd == -1) {
        perror("open error");
        return -1;
    }

    write_len_data(fd, 100, 'a');
    print_pos(fd);
    lseek(fd, 10, SEEK_SET);
    read_len_data(fd, 40);
    print_pos(fd);
    write_len_data(fd, 20, 'b');
    print_pos(fd);

    close(fd);
    return 0;
}

int main(int argc, char *argv[]) {
    fpos_test(false);
    return 0;
}

到了這里,關(guān)于文件IO_文件讀寫(附Linux-5.15.10內(nèi)核源碼分析)的文章就介紹完了。如果您還想了解更多內(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)文章

  • 【嵌入式環(huán)境下linux內(nèi)核及驅(qū)動(dòng)學(xué)習(xí)筆記-(10-內(nèi)核內(nèi)存管理)】

    【嵌入式環(huán)境下linux內(nèi)核及驅(qū)動(dòng)學(xué)習(xí)筆記-(10-內(nèi)核內(nèi)存管理)】

    對(duì)于包含MMU(內(nèi)存管理單元)的處理器而言,linux系統(tǒng)以虛擬內(nèi)存的方式為每個(gè)進(jìn)程分配最大4GB的內(nèi)存。這真的4GB的內(nèi)存空間被分為兩個(gè)部分–用戶空間 與 內(nèi)核空間。用戶空間地地址分布為0~3GB,剩下的3 ~ 4GB 為內(nèi)核空間。如下圖。 用戶進(jìn)程通常只能訪問(wèn)用戶空間的虛擬地址

    2024年02月11日
    瀏覽(23)
  • Linux內(nèi)核源碼分析 1:Linux內(nèi)核體系架構(gòu)和學(xué)習(xí)路線

    Linux內(nèi)核源碼分析 1:Linux內(nèi)核體系架構(gòu)和學(xué)習(xí)路線

    好久沒有動(dòng)筆寫文章了,這段時(shí)間經(jīng)歷了蠻多事情的。這段時(shí)間自己寫了一兩個(gè)基于不同指令集的 Linux 內(nèi)核, x86 和 RISC-V 。期間也去做了一些嵌入式相關(guān)的工作,研究了一下 ARM 指令集架構(gòu)。 雖然今年九月份我就要申請(qǐng)了,具體申請(qǐng) AI 方向還是機(jī)器人、嵌入式、操作系統(tǒng)、

    2024年02月07日
    瀏覽(30)
  • Linux內(nèi)核源碼分析 (A)常見內(nèi)核面試題

    Linux內(nèi)核源碼分析 (A)常見內(nèi)核面試題

    系統(tǒng)調(diào)用 do_fork() : copy_process() 定時(shí)中斷 do_timer() 喚醒進(jìn)程 wake_up_process() :進(jìn)程由睡眠狀態(tài)轉(zhuǎn)為 RUNNING 狀態(tài) 系統(tǒng)調(diào)用 sys_sched_yield() 改變進(jìn)程的調(diào)度策略 sched_setscheduler() : 什么情況下會(huì)發(fā)生調(diào)度時(shí)機(jī):阻塞操作、中斷返回之前(系統(tǒng)調(diào)用返回用戶空間時(shí))、被喚醒的進(jìn)程會(huì)

    2024年02月10日
    瀏覽(26)
  • 【Linux 內(nèi)核源碼分析筆記】系統(tǒng)調(diào)用

    【Linux 內(nèi)核源碼分析筆記】系統(tǒng)調(diào)用

    在Linux內(nèi)核中,系統(tǒng)調(diào)用是用戶空間程序與內(nèi)核之間的接口,它允許用戶空間程序請(qǐng)求內(nèi)核執(zhí)行特權(quán)操作或訪問(wèn)受保護(hù)的內(nèi)核資源。系統(tǒng)調(diào)用提供了一種安全可控的方式,使用戶程序能夠利用內(nèi)核功能而不直接訪問(wèn)底層硬件。 系統(tǒng)調(diào)用: 通過(guò)系統(tǒng)調(diào)用,用戶程序可以請(qǐng)求內(nèi)核

    2024年02月03日
    瀏覽(30)
  • 【Linux 內(nèi)核源碼分析】RCU機(jī)制

    【Linux 內(nèi)核源碼分析】RCU機(jī)制

    Linux內(nèi)核的RCU(Read-Copy-Update)機(jī)制是一種用于實(shí)現(xiàn)高效讀取和并發(fā)更新數(shù)據(jù)結(jié)構(gòu)的同步機(jī)制。它在保證讀操作不被阻塞的同時(shí),也能夠保證數(shù)據(jù)的一致性。 RCU的核心思想是通過(guò)延遲資源釋放來(lái)實(shí)現(xiàn)無(wú)鎖讀取,并且避免了傳統(tǒng)鎖帶來(lái)的爭(zhēng)用和開銷。具體而言,RCU維護(hù)了一個(gè)“回

    2024年01月15日
    瀏覽(18)
  • 【Linux 內(nèi)核源碼分析】物理內(nèi)存組織結(jié)構(gòu)

    多處理器系統(tǒng)兩種體系結(jié)構(gòu): 非一致內(nèi)存訪問(wèn)(Non-Uniform Memory Access,NUMA):這種體系結(jié)構(gòu)下,內(nèi)存被劃分成多個(gè)內(nèi)存節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)由不同的處理器訪問(wèn)。訪問(wèn)一個(gè)內(nèi)存節(jié)點(diǎn)所需的時(shí)間取決于處理器和內(nèi)存節(jié)點(diǎn)之間的距離,因此處理器與內(nèi)存節(jié)點(diǎn)之間的距離會(huì)影響內(nèi)存訪問(wèn)

    2024年02月22日
    瀏覽(22)
  • 《Linux內(nèi)核源碼分析》(2)進(jìn)程原理及系統(tǒng)調(diào)用

    《Linux內(nèi)核源碼分析》(2)進(jìn)程原理及系統(tǒng)調(diào)用

    操作系統(tǒng)的作用 :作為硬件的使用層,提供使用硬件資源的能力, 進(jìn)程的作用 :作為操作系統(tǒng)使用層,提供使用操作系統(tǒng)抽象出的資源層的能力 進(jìn)程、線程和程序的區(qū)別 :進(jìn)程指計(jì)算機(jī)中已運(yùn)行的程序。進(jìn)程本身不是基本的運(yùn)行單位,而是線程的容器。 程序本身只是指令

    2024年02月07日
    瀏覽(35)
  • 【Linux 內(nèi)核源碼分析】進(jìn)程調(diào)度 -CFS 調(diào)度器

    【Linux 內(nèi)核源碼分析】進(jìn)程調(diào)度 -CFS 調(diào)度器

    Linux內(nèi)核調(diào)度器是負(fù)責(zé)決定哪個(gè)進(jìn)程在何時(shí)執(zhí)行的組件。它管理著CPU資源的分配和任務(wù)的調(diào)度,以確保系統(tǒng)資源的合理利用和任務(wù)的高效執(zhí)行。Linux內(nèi)核中常見的調(diào)度器有多種,包括經(jīng)典的O(1)調(diào)度器、CFS(Completely Fair Scheduler)調(diào)度器等。這些調(diào)度器根據(jù)不同的策略和算法來(lái)進(jìn)

    2024年01月17日
    瀏覽(22)
  • 【Linux 內(nèi)核源碼分析】?jī)?nèi)存管理——Slab 分配器

    在Linux內(nèi)核中,伙伴分配器是一種內(nèi)存管理方式,以頁(yè)為單位進(jìn)行內(nèi)存的管理和分配。但是在內(nèi)核中,經(jīng)常會(huì)面臨結(jié)構(gòu)體內(nèi)存分配問(wèn)題,而這些結(jié)構(gòu)體的大小通常是小于一頁(yè)的。如果使用伙伴分配器來(lái)分配這些小內(nèi)存,將造成很大的內(nèi)存浪費(fèi)。因此,為了解決這個(gè)問(wèn)題,Sun公

    2024年02月22日
    瀏覽(26)
  • Linux內(nèi)核源碼分析 (6)RCU機(jī)制及內(nèi)存優(yōu)化屏障

    問(wèn)題: RCU 英文全稱為 Read-Copy-Update ,顧名思義就是 讀-拷貝-更新 ,是 Linux 內(nèi)核中重要的同步機(jī)制。 Linux 內(nèi)核已有原子操作、讀寫信號(hào)量等鎖機(jī)制,為什么要單獨(dú)設(shè)計(jì)一個(gè)比較復(fù)雜的新機(jī)制? RCU的原理 RCU記錄所有指向共享數(shù)據(jù)的指針的使用者,當(dāng)要修改該共享數(shù)據(jù)時(shí),首先

    2024年02月10日
    瀏覽(32)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包