【Linux文件操作】文件操作系統調用

目錄

一、文件創建(creat 系統調用)?

1.1 函數原型

1.2 參數說明?

1.3 返回值?

1.4 使用示例

二、文件打開(open 系統調用)?

2.1 函數原型

2.2 參數說明?

2.3 返回值?

2.4 使用示例

三、文件讀寫(read 和 write 系統調用)?

3.1 read 系統調用?

3.2 write 系統調用?

3.3 使用示例

四、文件定位(lseek 系統調用)?

4.1 函數原型

4.2 參數說明?

4.3 返回值?

4.4 使用示例

五、文件關閉(close 系統調用)?

5.1 函數原型

5.2 參數說明?

5.3 返回值?

5.4 注意事項?

5.5 使用示例

六、總結與


在 Linux 系統中,文件操作是非常核心且基礎的功能。無論是應用程序的開發,還是對系統的日常管理,都離不開對文件的創建、打開、讀寫、定位和關閉等操作。而這些操作的底層實現,很大程度上依賴于系統調用。本文將詳細介紹 Linux 文件操作中涉及的主要系統調用,深入理解 Linux 文件操作的原理和實現方式。?


一、文件創建(creat 系統調用)?

在 Linux 中,創建一個新文件可以使用 creat 系統調用。它的主要功能是創建一個新的空文件,如果指定的文件已經存在,則會將其截斷為零長度(即清空文件內容)。?

1.1 函數原型

#include <fcntl.h>
int creat(const char *pathname, mode_t mode);

1.2 參數說明?

  • pathname:指向要創建的文件路徑名的字符串指針。可以是絕對路徑,也可以是相對路徑。?
  • mode:指定新文件的權限模式。它由一系列權限位組成,這些權限位決定了文件所有者、所屬組和其他用戶對該文件的訪問權限。常見的權限位有:?
    • S_IRUSR:所有者具有讀權限(0400)?
    • S_IWUSR:所有者具有寫權限(0200)?
    • S_IXUSR:所有者具有執行權限(0100)?
    • S_IRGRP:所屬組具有讀權限(0040)?
    • S_IWGRP:所屬組具有寫權限(0020)?
    • S_IXGRP:所屬組具有執行權限(0010)?
    • S_IROTH:其他用戶具有讀權限(0004)?
    • S_IWOTH:其他用戶具有寫權限(0002)?
    • S_IXOTH:其他用戶具有執行權限(0001)?

這些權限位可以通過按位或(|)運算組合使用,例如,S_IRUSR | S_IWUSR 表示所有者具有讀寫權限。?

1.3 返回值?

  • 成功:返回一個非負的文件描述符(file descriptor),該文件描述符用于后續對文件的操作。?
  • 失敗:返回 - 1,并設置 errno 來指示錯誤類型。常見的錯誤有:?
  • EEXIST:指定的文件已經存在,且沒有被截斷(當使用 O_CREAT | O_EXCL 標志時,如果文件存在則會返回該錯誤,但 creat 系統調用本身如果文件存在會截斷文件,所以此錯誤在 creat 中較少見)?
  • ENOENT:路徑名中的目錄不存在?
  • EACCES:沒有權限創建文件或訪問路徑中的目錄?
  • ENOSPC:文件系統沒有足夠的空間創建新文件?

1.4 使用示例

#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>int main() {int fd;// 創建一個名為"testfile.txt"的文件,所有者具有讀寫權限,所屬組和其他用戶無權限fd = creat("testfile.txt", S_IRUSR | S_IWUSR);if (fd == -1) {perror("creat failed");exit(EXIT_FAILURE);}printf("File created successfully with file descriptor: %d\n", fd);close(fd); // 創建文件后要記得關閉文件描述符return 0;
}

    使用 creat 函數創建了一個名為 “testfile.txt” 的文件,設置所有者具有讀寫權限。如果創建成功,會輸出文件描述符;如果失敗,會通過 perror 函數打印錯誤信息。?

    二、文件打開(open 系統調用)?

    open 系統調用是 Linux 中用于打開一個已存在的文件或創建一個新文件的主要系統調用。它比 creat 系統調用功能更強大,可以通過不同的標志組合實現多種操作。?

    2.1 函數原型

    #include <fcntl.h>
    int open(const char *pathname, int flags);
    int open(const char *pathname, int flags, mode_t mode);

    2.2 參數說明?

    pathname:與 creat 系統調用中的 pathname 參數相同,指向要打開或創建的文件路徑名。?

    flags:用于指定打開文件的方式和行為,是一個整數,可以由多個標志按位或組合而成。常見的標志有:?

    • O_RDONLY:以只讀方式打開文件?
    • O_WRONLY:以只寫方式打開文件?
    • O_RDWR:以讀寫方式打開文件?
    • O_CREAT:如果指定的文件不存在,則創建該文件。此時需要提供第三個參數 mode 來指定新文件的權限。?
    • O_EXCL:與 O_CREAT 一起使用,如果文件已經存在,則 open 調用失敗(返回 - 1),可以用于防止覆蓋已存在的文件。?
    • O_TRUNC:如果文件已經存在且以可寫方式打開(O_WRONLY 或 O_RDWR),則將文件截斷為零長度。?
    • O_APPEND:以追加方式打開文件,每次寫操作都將數據添加到文件的末尾。?

    mode:當 flags 中包含 O_CREAT 標志時,該參數用于指定新文件的權限模式,與 creat 系統調用中的 mode 參數相同。如果 flags 中不包含 O_CREAT,則該參數被忽略。?

    2.3 返回值?

    • 成功:返回一個非負的文件描述符,用于后續對文件的操作。?
    • 失敗:返回 - 1,并設置 errno 指示錯誤類型。常見的錯誤與 creat 系統調用類似,此外還有:?
      • EINVAL:flags 參數無效?
      • EMFILE:進程已打開的文件描述符達到上限?

    2.4 使用示例

    #include <stdio.h>
    #include <fcntl.h>
    #include <stdlib.h>
    #include <unistd.h>int main() {int fd1, fd2, fd3;// 以只讀方式打開已存在的文件"testfile.txt"fd1 = open("testfile.txt", O_RDONLY);if (fd1 == -1) {perror("open for read failed");exit(EXIT_FAILURE);}// 以讀寫方式打開文件,如果文件不存在則創建,權限為所有者讀寫,組和其他用戶只讀fd2 = open("newfile.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);if (fd2 == -1) {perror("open for read-write and create failed");close(fd1);exit(EXIT_FAILURE);}// 以只寫、追加方式打開文件,若文件不存在則創建fd3 = open("logfile.txt", O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR);if (fd3 == -1) {perror("open for write and append failed");close(fd1);close(fd2);exit(EXIT_FAILURE);}printf("fd1: %d, fd2: %d, fd3: %d\n", fd1, fd2, fd3);// 關閉文件描述符close(fd1);close(fd2);close(fd3);return 0;
    }

    展示了 open 系統調用的幾種常見用法:只讀打開已存在文件、讀寫打開并創建新文件、只寫追加打開并創建新文件。?

    三、文件讀寫(read 和 write 系統調用)?

    打開文件后,就可以進行讀寫操作了。Linux 提供了 read 和 write 系統調用來實現對文件的讀寫。?

    3.1 read 系統調用?

    read 系統調用用于從已打開的文件中讀取數據。?

    ①函數原型

    #include <unistd.h>
    ssize_t read(int fd, void *buf, size_t count);

    ②參數說明?

    • fd:文件描述符,即 open 或 creat 系統調用返回的非負整數,標識要讀取的文件。?
    • buf:指向一個緩沖區的指針,用于存儲讀取到的數據。?
    • count:指定要讀取的字節數。?

    ③ 返回值?

    • 成功:返回實際讀取到的字節數。如果已經到達文件末尾,則返回 0。?
    • 失敗:返回 - 1,并設置 errno 指示錯誤類型,如 EBADF(文件描述符無效)、EIO(I/O 錯誤)等。?

    3.2 write 系統調用?

    write 系統調用用于向已打開的文件中寫入數據。?

    ①函數原型

    #include <unistd.h>
    ssize_t write(int fd, const void *buf, size_t count);

    ②參數說明?

    • fd:文件描述符,標識要寫入的文件。?
    • buf:指向一個緩沖區的指針,該緩沖區中存儲了要寫入的數據。?
    • count:指定要寫入的字節數。?

    ③返回值?

    • 成功:返回實際寫入的字節數。注意,實際寫入的字節數可能小于 count,這并不一定表示錯誤,可能是由于各種原因(如磁盤空間不足、信號中斷等)導致的。?
    • 失敗:返回 - 1,并設置 errno 指示錯誤類型,如 EBADF(文件描述符無效或不具有寫權限)、EIO(I/O 錯誤)等。?

    3.3 使用示例

    #include <stdio.h>
    #include <fcntl.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>int main() {int fd;char write_buf[] = "Hello, Linux File Operation!";char read_buf[1024];ssize_t nwritten, nread;// 以讀寫方式打開文件,不存在則創建fd = open("rwtest.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);if (fd == -1) {perror("open failed");exit(EXIT_FAILURE);}// 寫入數據nwritten = write(fd, write_buf, strlen(write_buf));if (nwritten == -1) {perror("write failed");close(fd);exit(EXIT_FAILURE);}printf("Wrote %zd bytes: %s\n", nwritten, write_buf);// 將文件指針移到文件開頭(否則讀取不到剛寫入的數據)off_t offset = lseek(fd, 0, SEEK_SET);if (offset == -1) {perror("lseek failed");close(fd);exit(EXIT_FAILURE);}// 讀取數據nread = read(fd, read_buf, sizeof(read_buf) - 1); // 留一個字節給'\0'if (nread == -1) {perror("read failed");close(fd);exit(EXIT_FAILURE);} else if (nread == 0) {printf("Reached end of file\n");} else {read_buf[nread] = '\0'; // 加上字符串結束符printf("Read %zd bytes: %s\n", nread, read_buf);}close(fd);return 0;
    }

    先向文件寫入一段字符串,然后使用 lseek 系統調用將文件指針移到文件開頭,再讀取文件內容并打印。需要注意的是,write 調用返回的實際寫入字節數可能小于請求的字節數,因此在實際應用中可能需要循環寫入,直到所有數據都被寫入。同樣,read 調用也可能需要循環讀取,直到讀取到預期的數據量或到達文件末尾。?

    四、文件定位(lseek 系統調用)?

    在對文件進行讀寫操作時,系統會維護一個文件偏移量(file offset),也稱為文件指針,它指示了下一次讀寫操作開始的位置。lseek 系統調用用于修改這個文件偏移量,實現對文件的隨機訪問。?

    4.1 函數原型

    #include <unistd.h>
    off_t lseek(int fd, off_t offset, int whence);

    4.2 參數說明?

    • fd:文件描述符,標識要操作的文件。?
    • offset:偏移量,是一個有符號整數,表示要移動的字節數。?
    • whence:用于指定偏移量的參考位置,有以下三種取值:?
      • SEEK_SET:將文件偏移量設置為 offset 字節(從文件開頭開始計算)。?
      • SEEK_CUR:將文件偏移量設置為當前偏移量加上 offset 字節。?
      • SEEK_END:將文件偏移量設置為文件末尾加上 offset 字節(offset 為負時表示向文件開頭方向移動)。?

    4.3 返回值?

    • 成功:返回新的文件偏移量(從文件開頭開始計算的字節數)。?
    • 失敗:返回 - 1,并設置 errno 指示錯誤類型,如 EBADF(文件描述符無效)、ESPIPE(文件是管道、FIFO 或套接字,這些文件不支持定位操作)等。?

    4.4 使用示例

    #include <stdio.h>
    #include <fcntl.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>int main() {int fd;char buf[100];off_t offset;// 創建并打開一個文件fd = open("seektest.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);if (fd == -1) {perror("open failed");exit(EXIT_FAILURE);}// 寫入一些數據const char *data = "0123456789abcdefghijklmnopqrstuvwxyz";write(fd, data, strlen(data));// 將文件指針移到開頭offset = lseek(fd, 0, SEEK_SET);if (offset == -1) {perror("lseek to beginning failed");close(fd);exit(EXIT_FAILURE);}printf("Moved to beginning, offset: %ld\n", (long)offset);// 讀取5個字節ssize_t nread = read(fd, buf, 5);if (nread == -1) {perror("read failed");close(fd);exit(EXIT_FAILURE);}buf[nread] = '\0';printf("Read %zd bytes: %s\n", nread, buf);// 從當前位置向后移動10個字節offset = lseek(fd, 10, SEEK_CUR);if (offset == -1) {perror("lseek from current failed");close(fd);exit(EXIT_FAILURE);}printf("Moved 10 bytes from current, new offset: %ld\n", (long)offset);// 讀取5個字節nread = read(fd, buf, 5);if (nread == -1) {perror("read failed");close(fd);exit(EXIT_FAILURE);}buf[nread] = '\0';printf("Read %zd bytes: %s\n", nread, buf);// 從文件末尾向前移動20個字節offset = lseek(fd, -20, SEEK_END);if (offset == -1) {perror("lseek from end failed");close(fd);exit(EXIT_FAILURE);}printf("Moved 20 bytes before end, new offset: %ld\n", (long)offset);// 讀取5個字節nread = read(fd, buf, 5);if (nread == -1) {perror("read failed");close(fd);exit(EXIT_FAILURE);}buf[nread] = '\0';printf("Read %zd bytes: %s\n", nread, buf);close(fd);return 0;
    }

    展示了 lseek 系統調用的三種使用方式:從文件開頭設置偏移量、從當前位置調整偏移量、從文件末尾調整偏移量。通過 lseek,我們可以靈活地定位到文件的任意位置進行讀寫操作,實現隨機訪問。?

    五、文件關閉(close 系統調用)?

    當對文件的操作完成后,需要使用 close 系統調用來關閉文件,釋放與該文件相關的資源,如文件描述符等。?

    5.1 函數原型

    #include <unistd.h>
    int close(int fd);

    5.2 參數說明?

    • fd:要關閉的文件的文件描述符。?

    5.3 返回值?

    • 成功:返回 0。?
    • 失敗:返回 - 1,并設置 errno 指示錯誤類型,如 EBADF(文件描述符無效或已經關閉)等。?

    5.4 注意事項?

    • 每個進程能打開的文件描述符數量是有限的,因此在使用完文件后,一定要及時調用 close 關閉文件,以釋放文件描述符,避免資源耗盡。?
    • 關閉文件后,該文件描述符將不再有效,不能再用于對文件的讀寫等操作。?

    5.5 使用示例

    #include <stdio.h>
    #include <fcntl.h>
    #include <stdlib.h>
    #include <unistd.h>int main() {int fd;fd = open("closetest.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);if (fd == -1) {perror("open failed");exit(EXIT_FAILURE);}// 對文件進行一些操作...// 關閉文件if (close(fd) == -1) {perror("close failed");exit(EXIT_FAILURE);}printf("File closed successfully\n");return 0;
    }

    這個示例比較簡單,展示了打開文件后進行一些操作,然后關閉文件的過程。在實際應用中,無論對文件的操作是否成功,都應該在適當的時候關閉文件。?

    六、總結與

    在實際使用這些系統調用時,需要注意以下幾點:?

    • 始終檢查系統調用的返回值,及時處理可能出現的錯誤。?
    • 注意文件權限的設置,確保文件的訪問安全。?
    • 及時關閉不再使用的文件,釋放系統資源。?
    • 對于讀寫操作,要考慮到實際讀寫的字節數可能小于請求的字節數,必要時進行循環操作。?

    隨著 Linux 系統的不斷發展,文件操作的方式和接口也在不斷完善。但這些基礎的系統調用仍然是理解 Linux 文件系統和進行底層開發的關鍵。未來,我們可以進一步學習 Linux 文件系統的底層原理,以及如何利用這些系統調用來實現更復雜的文件操作功能,如文件復制、移動、權限修改等。同時,也可以學習更高層次的文件操作庫函數(如標準 C 庫中的 fopen、fread、fwrite 等),它們是對這些系統調用的封裝,使用起來更加方便,但了解其底層實現的系統調用有助于我們更好地理解和使用這些庫函數。?

    通過不斷學習和實踐,我們可以更深入地掌握 Linux 文件操作技術,為開發高效、穩定的 Linux 應用程序打下堅實的基礎。


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

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

    相關文章

    FreeRTOS源碼分析六:vTaskDelay vs xTaskDelayUntil任務延時

    系列文章目錄 FreeRTOS源碼分析一&#xff1a;task創建&#xff08;RISCV架構&#xff09; FreeRTOS源碼分析二&#xff1a;task啟動&#xff08;RISCV架構&#xff09; FreeRTOS源碼分析三&#xff1a;列表數據結構 FreeRTOS源碼分析四&#xff1a;時鐘中斷處理響應流程 Free…

    Linux學習-應用軟件編程(fread/fwrite,流定義相關接口)

    freadsize_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 功能按塊從文件讀取數據&#xff0c;從文件中讀 nmemb 個、每個 size 字節的元素&#xff0c;存入 ptr 指向的內存。參數- ptr &#xff1a;存儲讀取數據的內存首地址&#xff08;需提前分配足夠…

    IP分片(IP Fragmentation)

    目錄 一、核心概念:MTU與分片的必要性 二、IP分片的關鍵字段(IPv4頭部) 三、分片與重組流程 1. 分片過程(發送端或中間路由器) 2. 重組過程(接收端) 四、IPv4與IPv6分片的差異 五、分片的潛在問題與風險 六、總結 一、傳輸效率降低,帶寬開銷增加 二、可靠性降低,數據丟…

    高并發內存池 內存釋放回收(6)

    文章目錄前言一、threadcache回收內存二、centralcache回收內存三、pagecache回收內存總結前言 Hello&#xff0c;我們繼續乘勝追擊 ??本篇難度較大&#xff0c;大家要好好學一下 一、threadcache回收內存 當某個線程申請的對象不用了&#xff0c;可以將其釋放給 thread cac…

    2438. 二的冪數組中查詢范圍內的乘積

    2438. 二的冪數組中查詢范圍內的乘積 初始理解題目 首先&#xff0c;我們需要清楚地理解題目在說什么。題目給出一個正整數 n&#xff0c;要求我們構造一個數組 powers&#xff0c;這個數組滿足以下條件&#xff1a; 元素性質?&#xff1a;數組中的每個元素都是 2 的冪。即…

    【PyTorch學習筆記 - 01】 Tensors(張量)

    最近項目需要優化一下目標檢測網絡&#xff0c;在這個過程中發現還是得增加對框架底層的掌握才可行。于是準備對pytorch的一些基本概念做一些再理解。參考PyTorch的wiki&#xff0c;對自己的學習過程做個記錄。 Tensors 是一種特殊的數據結構&#xff0c;與數組和矩陣非常相似…

    【C/C++】(struct test*)0->b 講解

    提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 一、什么是結構體成員的偏移量&#xff1f; 二、為什么需要計算偏移量&#xff1f; 三、如何計算偏移量&#xff1f; 四、總結 一、什么是結構體成員的偏移量&#…

    使用Pytest進行接口自動化測試(三)

    &#xff08;一&#xff09;YAML 之前在項目中&#xff0c;我們也是用過YAML來做配置文件&#xff0c;他用于以人類可讀的形式存儲信息&#xff0c; 特點: 一種簡易的可讀語言&#xff0c;用于人和計算機交換數據 通常用來存儲配置信息 跟python類似&…

    算法訓練營day46 647. 回文子串、516.最長回文子序列、動態規劃總結篇

    今天是動態規劃的最后一篇內容了&#xff0c;本篇主要是針對回文字符串這種“與眾不同”的遞推規律來進行講解 647. 回文子串 統計并返回這個字符串中 回文子串 的數目 暴力解法 兩層for循環&#xff0c;遍歷區間起始位置和終止位置&#xff0c;然后還需要一層遍歷判斷這個區…

    Qt界面優化

    1.QSS在網頁前端開發領域中&#xff0c;CSS 是一個至關重要的部分&#xff0c;描述了一個網頁的 “樣式”&#xff0c;從而起到對網頁美化的作用。所謂樣式&#xff0c;包括不限于大小、位置、顏色、背景、間距、字體等等。網頁開發作為 GUI 的典型代表&#xff0c;也對于其他客…

    week1+2+3

    408 計組 1.基本組成2.數據的表示和運算定點數&#xff1a;把數字分為定點整數和定點小數分開存儲 浮點數&#xff1a;用科學計數法存儲 原碼 -全部取反-> 反碼 反碼 1->補碼 補碼 -符號位取反->移碼帶余除法&#xff1a;設x,m∈Z&#xff0c;m>0則存在唯一的整數q…

    java8中javafx包缺少報錯

    今天拉取一個jdk1.8的項目里面有一個代碼用到了javafx&#xff0c;這個我記得是jdk中的包&#xff0c;正常不應該報錯的。然后發現jdk中還真沒有&#xff0c;查了一下是因為版本問題。 Java 8 及之前&#xff1a;Oracle JDK 自帶 JavaFX&#xff0c;OpenJDK 通常不包含Java 9 …

    day072-代碼檢查工具-Sonar與maven私服-Nexus

    文章目錄0. 老男孩思想-選對池塘釣美人魚1. 代碼回滾方案2. SonarQube2.1 代碼檢查工具2.2 部署sonarqube2.2.1 軟件要求2.2.2 安裝軟件2.2.3 啟動sonar2.2.4 部署插件2.3 sonar檢查java代碼2.3.1 創建sona項目2.3.2 分析java代碼2.3.3 Jenkins結合sonar檢查代碼2.4 sonar檢查非…

    【前端基礎】15、列表元素、表格元素、表單元素(注:極其粗略的記載。)

    一、列表元素 1、什么是列表元素2、有序列表&#xff08;ol、li&#xff09; ol有序列表 直接子元素只能是li。 li列表中的每一項。3、無序列表&#xff08;ul、li&#xff09; ol無序列表 直接子元素只能是li。 li列表中的每一項。4、定義列表&#xff08;dl、dt、dd&#xff…

    IRFBG30PBF Vishay威世MOSFET場效應管

    IRFBG30PBF Vishay威世&#xff1a;超快MOSFET 場效應管一、產品定位IRFBG30PBF 是Vishay威世推出的600V/30A N溝道功率MOSFET&#xff0c;采用第五代TrenchFET技術&#xff0c;專為開關電源、電機驅動、新能源逆變器等高功率場景設計。以85mΩ超低導通電阻和超快反向恢復&…

    【07-AGI的討論】

    AI ANI&#xff1a;artificial narrow intelligence; 如 智能音箱&#xff1b;自動駕駛汽車&#xff0c;網絡搜索&#xff0c;其他用于專業特定事項的工具&#xff1b; AGI&#xff1a;artificial general intelligence; building AI systems that could do anything a typical…

    [激光原理與應用-225]:機械 - 3D圖與2D圖各自的作用

    在機械設計與加工領域&#xff0c;3D圖和2D圖是兩種核心的工程表達方式&#xff0c;它們在產品設計、制造、裝配及維護等環節中扮演不同角色&#xff0c;具有互補性。以下是它們各自的作用及具體應用場景的詳細解析&#xff1a;一、3D圖的作用1. 直觀展示產品全貌三維可視化&am…

    【從零開始java學習|第一篇】java中的名詞概念(JDK、JVM、JRE等等)

    目錄 一、核心運行環境三要素&#xff08;JVM/JRE/JDK&#xff09; 二、常用開發指令&#xff08;JDK 自帶工具&#xff09; 三、一些其他概念 四、總結核心邏輯鏈 要入門 Java&#xff0c;理解核心概念之間的關系是基礎。以下是 Java 中最核心的基礎概念、工具及相關名詞的…

    UVa12345 Dynamic len(set(a[L:R]))

    [TOC](UVa12345 Dynamic len(set(a[L:R]))) 題目鏈接 UVA - 12345 Dynamic len(set(a[L:R])) 題意 有編號從 0 到 n?1 的 n 個數&#xff0c;有兩種操作&#xff1a; Q L R 詢問編號 L 到編號 R?1 的數中有多少個不同的數字。M X Y 將編號為 X 的數字改為 Y。 你的任務就是…

    [Ubuntu] VNC連接Linux云服務器 | 實現GNOME圖形化

    將桌面環境修改為 GNOME 并通過 VNC 遠程訪問的步驟 & TightVNC 的安裝與配置說明&#xff1a;1. 安裝 GNOME 桌面環境 sudo apt update sudo apt install ubuntu-gnome-desktop -y2. 安裝 TightVNC 服務器 sudo apt install tightvncserver -y3. 初始化 VNC Server 并設置…