【Linux系統】基礎IO(上)

1. 深入理解"文件"概念

1.1 文件的狹義理解

狹義上的“文件”主要指存儲在磁盤上的數據集合。具體包括:

  • 文件在磁盤里:文件是磁盤上以特定結構(如FAT、ext4文件系統)保存的數據集合,由字節或字符序列構成。磁盤作為永久性存儲介質,即使斷電后數據也不會丟失,因此文件的存儲是永久性的。
  • 磁盤是外設(輸入輸出設備)?:磁盤被歸類為外部設備,既是輸入設備(如讀取數據)也是輸出設備(如寫入數據)。因此,所有對文件的操作(如打開、讀取、寫入)本質上都是對外設的輸入和輸出,簡稱IO(Input/Output)。
  • IO的本質:文件操作如讀寫磁盤數據,不是直接在應用程序中完成,而是通過底層硬件交互實現的IO過程。例如,C語言的fopenfwrite函數最終會轉化為對外設的輸入輸出請求。

磁盤作為計算機外設的一種,既是輸入設備(讀取數據)也是輸出設備(寫入數據)。例如:

  • 當保存文檔時:數據從內存輸出到磁盤
  • 當打開文檔時:數據從磁盤輸入到內存

所有對磁盤文件的操作(創建、讀取、修改、刪除)本質上都是通過操作系統提供的輸入輸出(IO)接口完成的。

總結:狹義文件強調磁盤存儲的永久性和硬件交互的IO本質,所有操作都圍繞外設進行。

1.2?文件的廣義理解

在Linux/Unix操作系統中,有一個重要的設計理念:"一切皆文件"。這意味著:

? 硬件設備抽象為文件

  • 鍵盤 → /dev/input/
  • 顯示器 → /dev/tty
  • 磁盤 → /dev/sda
  • 網卡 → /dev/net

? 特殊文件類型

  • 塊設備文件(如磁盤)
  • 字符設備文件(如終端)
  • 命名管道(FIFO)
  • 套接字(Socket)

例如,在Linux中:

  • 向/dev/null寫入數據會直接被丟棄
  • 從/dev/random讀取會獲取隨機數
  • 通過/proc文件系統可以查看和修改內核參數

這種抽象極大簡化了系統編程接口,開發者可以使用統一的文件操作API來訪問各種資源。

1.3?文件操作的分類認知

文件存儲的實質

即使是0KB的空文件也會占用磁盤空間,原因包括:

? 文件元數據存儲:每個文件都需要存儲文件名、創建時間、權限等屬性信息

? 文件系統開銷:大多數文件系統有最小分配單元(如4KB的塊大小)

? 目錄條目:文件名需要在父目錄中建立對應的條目

文件的組成結構

文件由兩個主要部分組成:

  1. 文件屬性(元數據)

    • 文件名
    • 文件大小
    • 創建/修改/訪問時間
    • 所有者/權限信息
    • 存儲位置等
  2. 文件內容

    • 實際存儲的用戶數據
    • 可以是文本、二進制、多媒體等各種形式

例如,使用ls -l命令可以查看文件的元數據,使用cat命令可以查看文件內容。

文件操作的本質

所有文件操作都可以歸類為:

? 內容操作

  • 讀取(read)
  • 寫入(write)
  • 追加(append)
  • 截斷(truncate)

? 屬性操作

  • 重命名(rename)
  • 修改權限(chmod)
  • 更改所有者(chown)
  • 設置時間戳(touch)

1.4?系統層面的文件操作

進程與文件的關系

在操作系統中:

? 文件操作的主體是進程

? 每個進程維護一個文件描述符表

? 通過文件描述符來引用打開的文件

例如:

  • 標準輸入(stdin) → 文件描述符0
  • 標準輸出(stdout) → 文件描述符1
  • 標準錯誤(stderr) → 文件描述符2

對文件的操作本質是進程對文件的操作:文件操作由運行中的進程發起,進程通過系統調用請求操作系統執行文件任務(如打開、讀寫)。磁盤作為硬件資源,由操作系統統一管理,進程不能直接訪問磁盤。

操作系統的管理角色

操作系統作為磁盤的管理者,負責:

? 文件系統的實現(如ext4, NTFS)

? 磁盤空間分配與管理

? 文件緩存與IO調度

? 權限控制與安全機制

磁盤的管理者是操作系統:操作系統(如Linux內核)負責磁盤的底層管理,包括文件系統組織、數據存儲和安全控制。用戶程序不能繞過操作系統直接操作磁盤。

系統調用與庫函數

文件操作的實際執行路徑:

  1. 用戶程序調用庫函數(如fopen/fread)
  2. 庫函數封裝系統調用(如open/read)
  3. 系統調用觸發內核文件系統例程
  4. 內核與磁盤控制器交互完成IO

例如,C語言的fopen函數底層會調用open系統調用,fread會調用read系統調用。這些系統調用才是真正與操作系統內核交互的接口。

文件讀寫通過系統調用接口實現:C語言或C++的庫函數(如fopenfprintf)只是用戶層封裝,提供便利性;底層實現依賴于文件相關的系統調用接口(如open打開文件、read讀取數據、write寫入數據)。這些系統調用涉及模式切換(用戶態到內核態),確保操作安全和高效。所有語言(包括C)的文件操作最終都調用系統調用,因為硬件訪問必須通過操作系統。


2. C語言文件操作接口回顧

1. 文件打開與關閉

fopen()?- 打開文件

  • 功能:打開指定路徑的文件,返回文件指針(FILE*)。
  • 參數
    • filename:文件路徑(絕對或相對路徑)。
    • mode:打開模式(如?"r"?只讀、"w"?只寫、"a"?追加等)。
  • 返回值:成功返回文件指針,失敗返回?NULL

fclose()- 文件關閉

  • 功能:關閉已打開的文件流,釋放資源。
  • 參數FILE*?文件指針。
  • 返回值:成功返回?0,失敗返回?EOF(-1)。
#include <stdio.h>int main() {// 參數1: 文件名,參數2: 模式("r"讀/"w"寫/"a"追加)FILE *fp = fopen("example.txt", "r"); if (fp == NULL) {  // 檢查是否成功打開printf("文件打開失敗\n");return 1;}printf("文件打開成功\n");fclose(fp);  // 關閉文件return 0;
}

2. 字符讀寫

fgetc()?/?getc()?- 讀取單個字符

  • 功能:從文件讀取單個字符。
  • 參數FILE* stream
  • 返回值:成功返回讀取的字符(轉為?int),文件結束或失敗返回?EOF

示例代碼

FILE *fp = fopen("file.txt", "r");
if (fp) {char c = fgetc(fp);  // 從文件讀取一個字符while (c != EOF) {   // EOF 表示文件結束printf("%c", c);c = fgetc(fp);   // 繼續讀取下一個字符}fclose(fp);
}
  • 注釋
    • fgetc?和?getc?功能相同,但?getc?可能被實現為宏。
    • 返回值是?int?類型(可容納?EOF)。

fputc()?/?putc()?- 寫入單個字符

  • 功能:向文件寫入單個字符。
  • 參數
    • char c:待寫入字符。
    • FILE* stream:文件指針。
  • 返回值:成功返回寫入的字符,失敗返回?EOF
FILE *fp = fopen("output.txt", "w");
if (fp) {fputc('A', fp);  // 寫入字符 'A'fclose(fp);
}

3. 字符串讀寫

fgets()?- 讀取一行字符串

  • 功能:從文件讀取一行字符串。
  • 參數
    • char* str:存儲讀取數據的緩沖區。
    • int n:最大讀取長度(含結尾?\0)。
    • FILE* stream
  • 返回值:成功返回?str,失敗或文件結束返回?NULL
FILE *fp = fopen("data.txt", "r");
char buf[1024];
if (fp) {// 讀取一行(最多 sizeof(buf)-1 個字符)while (fgets(buf, sizeof(buf), fp) != NULL) {printf("%s", buf);}fclose(fp);
}
  • 注釋
    • 讀取到換行符或緩沖區滿時停止,末尾自動加?\0
    • 需配合?feof()?或?ferror()?檢查結束/錯誤。

fputs()?- 寫入字符串

  • 功能:向文件寫入字符串(不含自動換行)。
  • 參數
    • const char* str:字符串指針。
    • FILE* stream
FILE *fp = fopen("log.txt", "a");
if (fp) {fputs("Hello, World!\n", fp);  // 寫入字符串(不自動加換行)fclose(fp);
}
  • 注釋
    • 成功返回非負整數,失敗返回?EOF

4. 格式化讀寫

fprintf()?- 格式化寫入

  • 功能:按指定格式向文件寫入數據。
  • 參數:與?printf()?類似,增加文件指針參數。
FILE *fp = fopen("report.txt", "w");
if (fp) {int num = 100;fprintf(fp, "數值: %d\n", num);  // 類似 printf,但輸出到文件fclose(fp);
}

fscanf()?- 格式化讀取

  • 功能:按指定格式從文件讀取數據。
  • 參數:與?scanf()?類似,增加文件指針參數。
FILE *fp = fopen("data.txt", "r");
int a;
char str[20];
if (fp) {fscanf(fp, "%d %s", &a, str);  // 從文件讀取整數和字符串fclose(fp);
}
  • 注釋
    • 返回值是成功匹配的參數個數。

5. 塊數據讀寫

fread()?- 讀取數據塊

  • 功能:從文件讀取二進制數據塊。
  • 參數
    • const void* ptr:存儲目標地址。
    • size_t size:每個數據塊大小(字節)。
    • size_t nmemb:數據塊數量。
    • FILE* stream
struct Item
{ char name[20]; int size; 
};
struct Item items[3];
FILE *fp = fopen("/tmp/data.bin", "rb");
if (fp) {// 參數:緩沖區, 每個元素大小, 元素數量, 文件指針size_t count = fread(items, sizeof(struct Item), 3, fp);if (count != 3) {  // 檢查實際讀取數量printf("讀取不完整\n");}fclose(fp);
}
  • 注釋
    • 返回實際讀取的元素數量(非字節數)。
    • 適用于二進制文件(模式含?"b")。

fwrite()?- 寫入數據塊

  • 功能:向文件寫入二進制數據塊。
  • 參數
    • const void* ptr:數據源地址。
    • size_t size:每個數據塊大小(字節)。
    • size_t nmemb:數據塊數量。
    • FILE* stream
  • 返回值:成功寫入的數據塊數量。
struct Item items[3] = {{"Linux", 5}, {"C", 1}};
FILE *fp = fopen("/tmp/data.bin", "wb");
if (fp) {fwrite(items, sizeof(struct Item), 2, fp);  // 寫入2個結構體fclose(fp);
}
  • 注釋
    • 返回實際寫入的元素數量,需檢查是否完整。

6. 文件定位

fseek()?- 移動文件指針

  • 功能:移動文件位置指針。
  • 參數
    • FILE* stream
    • long offset:偏移量(字節)。
    • int whence:起始位置(SEEK_SET?文件頭、SEEK_CUR?當前位置、SEEK_END?文件尾)。
  • 返回值:成功返回?0,失敗返回非零值
FILE *fp = fopen("large.bin", "rb");
if (fp) {fseek(fp, 100L, SEEK_SET);  // 從文件頭偏移100字節long pos = ftell(fp);        // 獲取當前位置printf("當前位置: %ld\n", pos); fclose(fp);
}

rewind()?- 重置到文件頭

rewind(fp);  // 等價于 fseek(fp, 0L, SEEK_SET)

7. 錯誤處理

feof()?/?ferror()?- 檢查狀態

  • ferror():檢查文件操作是否出錯(非零值表示錯誤)。
  • feof():檢查是否到達文件末尾(非零值表示結束)。
FILE *fp = fopen("file.txt", "r");
if (fp) {char buf[100];fgets(buf, sizeof(buf), fp);if (feof(fp)) {printf("已到文件末尾\n");}if (ferror(fp)) {printf("讀取錯誤\n");}fclose(fp);
}
  • 注釋
    • feof()?在讀到末尾后返回真,ferror()?檢查錯誤標志。

3. 輸出信息到顯示器,你有哪些方法

C語言通過標準I/O庫提供多種輸出方式,均基于stdout(標準輸出流)實現:

  • printf():最常用的格式化輸出函數,自動追加換行符。

    printf("Hello World\n");  // 輸出字符串并換行
    
  • fprintf():指定輸出流(如stdout)的格式化輸出。

    fprintf(stdout, "Value: %d\n", 42);  // 等同于printf
    
  • puts():輸出字符串并自動換行。

    puts("Hello Linux");  // 輸出后自動換行
    
  • fputs():輸出字符串但不自動換行。

    fputs("No newline", stdout);  // 需手動添加\n
    
  • putchar()/fputc():單字符輸出。

    putchar('A');          // 輸出字符'A'
    fputc('B', stdout);    // 等同putchar
    
  • fwrite():二進制數據塊輸出(也可用于文本)。

    const char *msg = "Binary write\n";
    fwrite(msg, strlen(msg), 1, stdout);  // 直接寫入字節流
    

    關鍵點:所有方法均通過stdout(文件指針)指向顯示器。


4. stdin & stdout & stderr

在C語言中,stdinstdoutstderr是三個預定義的標準I/O流,它們在程序啟動時由系統自動打開。這些流是C標準庫的核心組成部分,提供了一種標準化的輸入/輸出處理方式。


1. 基本概念

流名稱文件描述符默認設備用途緩沖類型
stdin0鍵盤標準輸入行緩沖(終端)
stdout1顯示器標準輸出行緩沖(終端)
stderr2顯示器標準錯誤輸出無緩沖

關鍵特性

  • 類型均為?FILE*(文件指針)
  • 定義在?<stdio.h>?中
  • 生命周期與程序相同(自動打開/關閉)

2. 底層原理

(1) 聲明方式

// stdio.h 中的聲明
extern FILE *stdin;
extern FILE *stdout;
extern FILE *stderr;

(2) 與文件描述符的關系

#include <unistd.h>
// 驗證文件描述符
printf("stdin fd: %d\n",  fileno(stdin));  // 輸出 0
printf("stdout fd: %d\n", fileno(stdout)); // 輸出 1
printf("stderr fd: %d\n", fileno(stderr)); // 輸出 2

(3) 緩沖機制差異

緩沖行為典型場景
stdout行緩沖(遇到\n或滿緩沖才輸出)printf("Hello\n")
stderr無緩沖(立即輸出)perror("Error")
stdin行緩沖(等待回車鍵)scanf("%s", buf)

緩沖驗證代碼

#include <stdio.h>
#include <unistd.h>int main() {// stdout 有緩沖(可能不會立即顯示)fprintf(stdout, "This is stdout");sleep(2);  // 等待2秒// stderr 無緩沖(立即顯示)fprintf(stderr, "\nThis is stderr");return 0;
}

運行結果
先等待2秒,然后同時顯示:

This is stderr
This is stdout

3. 實際應用場景

(1) 輸入重定向

#include <stdio.h>int main() {char buf[100];// 從stdin讀取(可以是鍵盤或重定向文件)while (fgets(buf, sizeof(buf), stdin) != NULL) {fprintf(stdout, "Read: %s", buf);}return 0;
}

使用方式

# 鍵盤輸入
$ ./program
Hello
Read: Hello# 文件重定向
$ ./program < input.txt

(2) 分離正常輸出與錯誤

#include <stdio.h>int main() {// 正常輸出到stdout(可被重定向)fprintf(stdout, "Program started\n");// 錯誤輸出到stderr(始終顯示在終端)fprintf(stderr, "[ERROR] Invalid operation\n");return 0;
}

重定向效果

$ ./program > output.txt  # stdout重定向到文件
[ERROR] Invalid operation # stderr仍在終端顯示$ cat output.txt
Program started

(3) 錯誤診斷

#include <stdio.h>
#include <errno.h>int main() {FILE *fp = fopen("nonexist.txt", "r");if (fp == NULL) {// 輸出到stderr(無緩沖確保及時顯示)perror("fopen failed"); fprintf(stderr, "Error code: %d\n", errno);}return 0;
}

輸出

fopen failed: No such file or directory
Error code: 2

4. 高級用法

(1) 流重定向

#include <stdio.h>int main() {// 臨時重定向stdout到文件FILE *log = fopen("log.txt", "w");stdout = log;  // 重定向printf("This goes to log.txt");  // 寫入文件fclose(log);stdout = fdopen(1, "w");  // 恢復默認return 0;
}

(2) 多流協同

#include <stdio.h>int main() {int value;// 提示用戶輸入(stderr確保即時顯示)fprintf(stderr, "Enter a number: ");// 從stdin讀取scanf("%d", &value);// 結果輸出到stdoutprintf("Square: %d\n", value * value);return 0;
}

5. 重要注意事項

  1. 不要手動關閉
    這三個流會在程序結束時自動關閉,顯式關閉可能導致未定義行為:

    fclose(stdin);  // ? 危險操作!
    
  2. 緩沖同步
    在混合使用stdoutstderr時,使用fflush強制同步:

    printf("Processing...");
    fflush(stdout);  // 確保先顯示
    fprintf(stderr, "[WARN] Low memory");
    
  3. 重定向安全
    需要即時顯示的提示信息應使用stderr

    // 正確方式(重定向時仍顯示提示)
    fprintf(stderr, "Enter password: ");
    
  4. 二進制模式
    在Windows系統中,使用_setmode切換二進制模式以避免換行符轉換:

    #include <io.h>
    #include <fcntl.h>
    _setmode(_fileno(stdout), _O_BINARY);  // Windows專用
    

5. 打開文件的方式

r     Open text file for reading.The stream is positioned at the beginning of the file.r+     Open for reading and writing.The stream is positioned at the beginning of the file.w     Truncate(縮短) file to zero length or create text file for writing.The stream is positioned at the beginning of the file.w+     Open for reading and writing.The file is created if it does not exist, otherwise it is truncated.The stream is positioned at the beginning of the file.a     Open for appending (writing at end of file).The file is created if it does not exist.The stream is positioned at the end of the file.a+     Open for reading and appending (writing at end of file).The file is created if it does not exist. The initial file positionfor reading is at the beginning of the file,but output is always appended to the end of the file.

1. 基本模式

模式描述文件存在文件不存在緩沖區行為
"r"只讀(文本文件)打開文件返回?NULL輸入緩沖區
"w"只寫(文本文件)清空內容創建新文件輸出緩沖區
"a"追加(文本文件)保留內容,追加寫入創建新文件輸出緩沖區
"rb"只讀(二進制文件)打開文件返回?NULL輸入緩沖區
"wb"只寫(二進制文件)清空內容創建新文件輸出緩沖區
"ab"追加(二進制文件)保留內容,追加寫入創建新文件輸出緩沖區

關鍵說明

  • "r"?和?"rb"?要求文件必須存在,否則失敗?。
  • "w"/"wb"?會無條件清空文件(易錯點!)。
  • "a"/"ab"?的寫入位置始終在文件末尾?。

2. 擴展讀寫模式(+號組合)

模式描述讀操作位置寫操作位置
"r+"讀寫(文本文件)文件開頭當前指針位置
"w+"讀寫(文本文件)文件開頭先清空內容
"a+"讀寫(文本文件)文件開頭始終在文件末尾
"rb+"讀寫(二進制文件)文件開頭當前指針位置
"wb+"讀寫(二進制文件)文件開頭先清空內容
"ab+"讀寫(二進制文件)文件開頭始終在文件末尾

核心特性

  • "w+"?和?"wb+"?會先清空文件再打開?。
  • "a+"/"ab+"?的寫操作不受?fseek()?影響,永遠追加到末尾?。
  • 讀寫切換時需用?fseek()?或?rewind()?重定位指針?。
  • 換行符差異

    • 文本模式(無?b)在 Windows 中自動轉換?\r\n???\n,Linux/macOS 無此轉換?。
    • 二進制模式(帶?b)在所有平臺直接讀寫原始字節?。
  • 權限問題

    • "w"?和?"a"?模式需文件可寫權限,否則返回?NULL?。
    • Linux 系統可通過?chmod()?提前設置權限。

總結

  • 核心口訣

    r?讀,w?寫(清空!),a?追加,b?二進制,+?讀寫。

  • 最佳實踐

    1. 明確需求后選擇精準模式(如避免誤用?"w"?導致數據清空)。
    2. 二進制文件操作必須加?b(避免換行符問題)。
    3. 讀寫混合時用?fseek()?同步指針位置?。
    4. 始終檢查返回值并處理錯誤?。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90075.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90075.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90075.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

構建智能可視化分析系統:RTSP|RTMP播放器與AI行為識別的融合實踐

技術背景 隨著人工智能向邊緣側、實時化方向加速演進&#xff0c;視頻已從傳統的“記錄媒介”躍升為支撐智能感知與自動決策的關鍵數據入口。在安防監控、工業安全、交通治理等復雜應用場景中&#xff0c;行為識別系統的準確性和響應效率&#xff0c;越來越依賴于視頻源的時效…

AI入門學習-Python 最主流的機器學習庫Scikit-learn

一、Scikit-learn 核心定位是什么&#xff1a;Python 最主流的機器學習庫&#xff0c;涵蓋從數據預處理到模型評估的全流程。 為什么測試工程師必學&#xff1a;? 80% 的測試機器學習問題可用它解決? 無需深厚數學基礎&#xff0c;API 設計極簡? 與 Pandas/Numpy 無縫集成&a…

apache-doris安裝兼datax-web配置

Doris安裝 官方快速開始鏈接 下載2.1.10&#xff0c;解壓。我這邊個人服務器CPU是J1900&#xff0c;是沒有 avx2的&#xff0c;所以選no 配置JAVA_HOME&#xff0c;這里沒有配置的要配置下&#xff0c;注意要Oracle的jdk&#xff0c;openjdk沒有jps等工具集&#xff0c;后面跑…

問題實例:4G網絡下語音呼叫失敗

問題描述 測試機 撥號呼出后&#xff0c;一直在4G&#xff0c;超時后自動掛斷。 對比機可以呼出成功&#xff0c;呼出時回落3G。 日志分析 測試機和對比機一樣發起了CSFB 呼叫。 只是測試機后面沒有回落3G。 03:44:40.373264 [0xB0ED] LTE NAS EMM Plain OTA Outgoing Message …

MATLAB 2024b深度學習新特性全面解析與DeepSeek大模型集成開發技術

隨著人工智能技術向多學科交叉融合與工程實踐領域縱深發展&#xff0c;MATLAB 2024b深度學習工具箱通過架構創新與功能強化&#xff0c;為科研創新和行業應用提供了全棧式解決方案。基于該版本工具鏈的三大革新方向展開&#xff1a;一是構建覆蓋經典模型與前沿架構的體系化&…

Springboot美食分享平臺

一、 緒論 1.1 研究意義 當今社會作為一個飛速的發展社會&#xff0c;網絡已經完全滲入人們的生活&#xff0c; 網絡信息已成為傳播的第一大媒介&#xff0c; 可以毫不夸張說網絡資源獲取已逐步改變了人們以前的生活方式&#xff0c;網絡已成為人們日常&#xff0c;休閑主要工…

微信小程序——世界天氣小助手

哈嘍&#xff0c;大家好&#xff01; 最近小編開發了一個簡單的微信小程序——世界天氣小助手&#xff0c;希望大家喜歡。 No.1: 為大家介紹下開發者工具下的頁面結構。一共有三個界面{主頁、搜索頁、詳情頁}No.2&#xff1a; 具體頁面展示&#xff1a;當前頁面是主頁&…

基于單片機的智能家居安防系統設計

摘 要 為了應對目前人們提出的對生活越來越智能的要求&#xff0c;在提高生活品質的同時降低意外事件發生對用戶造成的經濟損失或其他損失。針對日常生活中經常發生的火災&#xff0c;失竊&#xff0c;電力資源浪費等生活問題&#xff0c;本設計正是在這種需求背景下展開研究…

騰訊研究院 | AI 浪潮中的中國品牌優勢解碼:華為、小米、大疆、科大訊飛等品牌從技術破壁到生態領跑的全維突圍

當 DeepSeek-R1 模型在 2025 年掀起大眾 AI 熱潮&#xff0c;當騰訊混元大模型與京東言犀大模型在產業場景中落地生根&#xff0c;中國品牌正在 AI 技術革命的浪潮中完成從追隨者到引領者的蛻變。騰訊營銷洞察&#xff08;TMI&#xff09;聯合京東消費及產業研究院、騰訊研究院…

FreeRTOS學習筆記——空閑任務prvIdleTask

文章目錄任務創建任務的內容推薦閱讀任務創建 prvIdleTask任務&#xff0c;是由任務調度函數vTaskStartScheduler創建的&#xff0c;任務優先級0&#xff0c;任務堆棧深度由配置選項configMINIMAL_STACK_SIZE定義。 void vTaskStartScheduler(void) {/* 其他代碼*//* Add the…

初識卷積神經網絡CNN

卷積神經網絡CNN 全連接神經網絡存在的問題: 輸入的形式應該是列向量&#xff0c;但是卷積神經網絡中的輸入是圖像(2D矩陣)&#xff0c;那么就需要對圖片進行展平處理&#xff0c;原本圖像中蘊含的空間等信息就被打亂了輸入的特征多了&#xff0c;那么神經元的參數就會很多&…

高層功能架構詳解 - openExo

高層功能架構詳解1. 系統整體結構與模塊化設計2. 兩大核心類&#xff1a;ExoData 與 ExoA. ExoDataB. ExoC. 數據結構的層級關系3. 多微控制器協作與BLE通信4. 主控軟件運行流程&#xff08;主循環偽代碼&#xff09;5. 架構優點小結6. 與 Code Structure 的關系實用建議1. 系統…

【西北工業大學公開課】導引系統原理(全61講)周軍 -個人筆記版 5000字

【嚴正聲明】此文檔為個人筆記&#xff1a;僅供個人與同學參考學習&#xff0c;記錄學習過程&#xff0c;嚴謹商業轉載&#xff0c;或商業售賣&#xff01;感謝西北工業大學公開課知識分享&#xff0c;公開資料開源&#xff01;視頻鏈接&#xff1a;【【西北工業大學】導引系統…

《命令行參數與環境變量:從使用到原理的全方位解析》

前言 當我們在終端輸入 ls -l /home 查看目錄詳情&#xff0c;或用 gcc -o hello hello.c 編譯代碼時&#xff0c;或許很少思考&#xff1a;這些空格分隔的 “指令 選項 路徑” 是如何被程序識別的&#xff1f;為什么 PATH 變量能讓系統找到可執行文件&#xff0c;而 HOME 變…

C++設計模式:單例模式 (現代C++主流實現方式Meyer‘s Singleton + 使用CRTP模板化)

文章目錄單例模式創建單例類餓漢式or懶漢式現代C單例模式的主流實現方式——Meyers Singleton使用 CRTP 模板化單例類單例模式 單例模式是指程序中只需要一個實例化對象&#xff0c;在全局作用域或整個代碼架構中&#xff0c;此對象只被實例化一次&#xff0c;就可以達到在整個…

Eureka 和 Nacos

一、基本介紹EurekaEureka 是 Netflix 公司開發的一款基于 REST 風格的服務注冊與發現組件&#xff0c;專為分布式系統設計。它遵循 AP 原則&#xff08;可用性、分區容錯性優先&#xff09;&#xff0c;強調在網絡分區等異常情況下的服務可用性&#xff0c;是 Spring Cloud Ne…

文件IO筆試題

目錄前言一、核心概念&#xff1a;二、關鍵操作步驟&#xff1a;三、為什么需要文件IO&#xff1f;四、常見類型&#xff1a;五、標準IO源碼六、筆試真題和練習1.代碼實現1代碼實現22.代碼實現3.代碼實現4.代碼實現5.代碼實現七、總結前言 文件IO&#xff08;文件輸入/輸出&am…

前端學習 5:DFT

DFT技術 DFT &#xff08;design for testability&#xff09;&#xff1a;指在設計系統和電路的同時&#xff0c;考慮測試的需求&#xff0c;通過增加一定的硬件開銷&#xff0c;獲得最大可測性的設計過程。&#xff08;因為增加了硬件&#xff0c;所以也帶來了不足&#xff…

最長遞增子序列(LIS)問題詳解

最長遞增子序列LIS問題詳解一、問題定義與核心特征1.1 問題描述1.2 核心特征二、基礎解法&#xff1a;動態規劃&#xff08;DP&#xff09;2.1 解法思路2.2 Java代碼實現2.3 復雜度分析三、優化解法&#xff1a;二分查找貪心3.1 核心思路3.2 二分查找的作用3.3 Java代碼實現代碼…

什么是HTTP長連接、短連接?誰更能抗DoS攻擊?

想象你在快餐店點餐&#xff1a; 你&#xff1a;“一個漢堡”收銀員&#xff1a;“好的&#xff0c;15元”交易結束&#xff0c;你離開隊伍你想加杯可樂&#xff0c;重新排隊你&#xff1a;“一杯可樂”收銀員&#xff1a;“好的&#xff0c;8元”再次離開… 這種每次溝通后立即…