博客專(zhuān)欄

EEPW首頁(yè) > 博客 > 嵌入式Linux:truncate()和ftruncate()函數(shù)截?cái)辔募?/p>

嵌入式Linux:truncate()和ftruncate()函數(shù)截?cái)辔募?/h1>
發(fā)布人:美男子玩編程 時(shí)間:2024-05-15 來(lái)源:工程師 發(fā)布文章

使用系統(tǒng)調(diào)用 truncate() 或 ftruncate() 可以將普通文件截?cái)酁橹付ㄗ止?jié)長(zhǎng)度。函數(shù)原型如下所示:

#include <unistd.h> int truncate(const char *path, off_t length);int ftruncate(int fd, off_t length);


這兩個(gè)函數(shù)的區(qū)別在于:ftruncate() 使用文件描述符 fd 來(lái)指定目標(biāo)文件,而 truncate() 則直接使用文件路徑 path 來(lái)指定目標(biāo)文件,但它們的功能是一樣的。


這兩個(gè)函數(shù)都可以對(duì)文件進(jìn)行截?cái)嗖僮?,即將文件截?cái)酁閰?shù) length 指定的字節(jié)長(zhǎng)度。截?cái)嗟囊馑际?,如果文件目前的大小大于參?shù) length 所指定的大小,則多余的數(shù)據(jù)將被丟失,相當(dāng)于將多余部分“砍”掉;如果文件目前的大小小于參數(shù) length 所指定的大小,則文件將被擴(kuò)展,擴(kuò)展部分將填充空字節(jié) 。


在使用 ftruncate() 進(jìn)行文件截?cái)嗖僮髦?,必須先調(diào)用 open() 函數(shù)打開(kāi)該文件以獲取文件描述符,并且必須具有可寫(xiě)權(quán)限,即調(diào)用 open() 打開(kāi)文件時(shí)需要指定 O_WRONLY 或 O_RDWR。


這兩個(gè)函數(shù)調(diào)用并不會(huì)影響文件的讀寫(xiě)位置偏移量,因此在截?cái)嗪笸ǔP枰匦略O(shè)置文件的當(dāng)前讀寫(xiě)位置偏移量,以防止由于之前指向的位置已經(jīng)不存在而發(fā)生錯(cuò)誤(例如,文件長(zhǎng)度變短后,原來(lái)的讀寫(xiě)位置不再存在)。


調(diào)用成功返回 0,失敗返回 -1,并設(shè)置 errno 以指示錯(cuò)誤原因。


分別使用 ftruncate() 和 truncate() 將當(dāng)前目錄下的文件 file1 截?cái)酁殚L(zhǎng)度 0 字節(jié),并將文件 file2 截?cái)酁殚L(zhǎng)度 1024 字節(jié)。

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h> int main(void) {    int fd;     /* 打開(kāi) file1 文件 */    if ((fd = open("./file1", O_RDWR)) < 0) {        perror("open error");        exit(EXIT_FAILURE);    }     /* 使用 ftruncate 將 file1 文件截?cái)酁殚L(zhǎng)度 0 字節(jié) */    if (ftruncate(fd, 0) < 0) {        perror("ftruncate error");        exit(EXIT_FAILURE);    }     /* 使用 truncate 將 file2 文件截?cái)酁殚L(zhǎng)度 1024 字節(jié) */    if (truncate("./file2", 1024) < 0) {        perror("truncate error");        exit(EXIT_FAILURE);    }     /* 關(guān)閉 file1 退出程序 */    if (close(fd) < 0) {        perror("close error");        exit(EXIT_FAILURE);    }     exit(EXIT_SUCCESS);}


這個(gè)程序是一個(gè)簡(jiǎn)單的C程序,它演示了如何使用系統(tǒng)調(diào)用 ftruncate() 和 truncate() 來(lái)截?cái)辔募?/span>


以下是程序的主要步驟:

  • 導(dǎo)入必要的頭文件。

  • 定義 main() 函數(shù)。

  • 在 main() 函數(shù)中聲明一個(gè)整型變量 fd 作為文件描述符。

  • 使用 open() 函數(shù)打開(kāi)名為 "file1" 的文件,并以讀寫(xiě)方式打開(kāi),如果打開(kāi)失敗則輸出錯(cuò)誤信息并退出程序。

  • 使用 ftruncate() 函數(shù)將文件描述符 fd 指向的文件截?cái)酁殚L(zhǎng)度為 0 字節(jié),如果截?cái)嗍t輸出錯(cuò)誤信息并退出程序。

  • 使用 truncate() 函數(shù)將名為 "file2" 的文件截?cái)酁殚L(zhǎng)度為 1024 字節(jié),如果截?cái)嗍t輸出錯(cuò)誤信息并退出程序。

  • 使用 close() 函數(shù)關(guān)閉文件描述符 fd,釋放資源。

  • 退出程序并返回 0。


總體而言,該程序展示了如何使用 ftruncate() 和 truncate() 函數(shù)來(lái)截?cái)辔募氖纠?,截?cái)辔募拈L(zhǎng)度可以根據(jù)需要進(jìn)行設(shè)置。


*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



關(guān)鍵詞: 嵌入式 Linux

相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉