国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何寫Linux下的tar打包軟件?

Linux愛好者 ? 來源:YongHao寫東西的cache ? 作者:YongHao寫東西的ca ? 2021-03-10 10:44 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

相信你對 linux 的 .tar.gz 有點熟悉,這就是先 tar 打包(.tar 后綴),再對此 tar 文件用 gzip 壓縮(.tar.gz)的后綴名。

值得注意的是, tar 不是壓縮軟件,它只做把一堆文件/文件夾打包到一個文件(tar 文件)里的事情,而文件聯系,文件權限,相對的路徑等都會給你保存好。一開始設計是 tar 跟 gzip 只做一件事情,各司其事,后來發現太麻煩了,于是就把壓縮功能整合到 tar 里了。

- Create a gzipped archive:

tar czf target.tar.gz file1 file2 file3

最近學習 OS 時寫了一個類似 tar 的項目,那么今天就趁熱打鐵簡單說一下如何寫一個打包軟件,這個軟件會將重復的文件內容通過 md5 比較,復用舊的內容。

基本單位 block

block 可以理解為文件系統的最小單位,分別有以下類型:

?directory block,文件夾 block,存儲文件夾 meta 信息;

?file block,文件 block,存儲文件 meta 信息;

?data block,只用來存文件內容;

Directory block,注意的是 entry 里要有 fileindex 來存儲重復文件的 name 的下標。同時,給 項目一個 root dir。

typedef struct {

char name[SIFS_MAX_NAME_LENGTH]; // name of the directory

time_t modtime; // time last modified 《- time()

uint32_t nentries;// 文件夾內的文件/文件夾數量

struct {

SIFS_BLOCKID blockID; // subdirectory 或者 file 的 blockID

uint32_t fileindex; // 重復文件的不同名字

} entries[SIFS_MAX_ENTRIES];

} SIFS_DIRBLOCK;

文件 Block,length 就是有多少 bytes 的文件內容,之后用來算有多少個 data block,firstblockID 記錄第一個數據 block 的 id,nfiles 記錄有多少重復內容的文件數量了,filenames 就是重復此文件 block 的文件內容的文件名字。

typedef struct {

time_t modtime; // time first file added 《- time()

size_t length; // length of files‘ contents in bytes

unsigned char md5[MD5_BYTELEN];//the MD5 cryptographic digest (a summary) of the files’ contents

SIFS_BLOCKID firstblockID;// the block number (blockID) of the files‘ first data-block

uint32_t nfiles; // n files with identical contents

char filenames[SIFS_MAX_ENTRIES][SIFS_MAX_NAME_LENGTH];// an array of each same file’s name and its modification time.

} SIFS_FILEBLOCK;

bitmaps數組,記錄了每個 block 的類型,有:文件、文件夾以及data block 三種類型。

通用函數

就讓大家看看關鍵函數好了:

讀 tar 后的文件的 meta 頭,記錄了 block 的大小( blocksize) 以及多少個 blocks。

void read_vol_header(FILE *vol, SIFS_VOLUME_HEADER *header) {

fread(header, sizeof(SIFS_VOLUME_HEADER), 1, vol);

printf(“header-》blocksize %zu, header-》nblocks %u

”, header-》blocksize , header-》nblocks);

}

bitmap,每次操作 tar 文件都要讀的。

void read_bitmap(FILE *vol, SIFS_BIT *bitmap, int nblocks) {

int size = nblocks * sizeof(SIFS_BIT);

fread(bitmap, size, 1, vol);

}

root_block 同理,讀和寫啥東西都要從 root block、root dir 出發。

void read_root_block(FILE *vol, SIFS_DIRBLOCK *dirblock){

fread(dirblock, sizeof(SIFS_DIRBLOCK), 1, vol);

printf(“read_root_block finish, dirblock.name: %s, dirblock.entrieds: %d, dirblock.modtime %ld

”, dirblock-》name, dirblock-》nentries,dirblock-》modtime);

}

路徑嘛,你懂的,。/sifs_put volumn ~/res.txt /dirB/subdirB/subsubdir/newfileB,要讀的內容可以靠 read 函數解決,但是寫到 tar 文件里的就要手動解析遞歸查路徑了。

void read_route_names(char* pathname, char** route_names, int *route_cnt) {

char *dir;

char *pathname_to_split = copyStr(pathname);

strcpy(pathname_to_split, pathname);

while ((dir = strsep(&pathname_to_split, “/”)) != NULL) {

route_names[*route_cnt] = copyStr(dir);

(*route_cnt)++;

}

}

以上幾乎是 mkdir,rmdir,writefile,readfile,putfile 等等操作都要做的。

實現

然后,應該舉一個 readfile 的例子就可以做代表了。

int recursive_dirinfo(SIFS_DIRBLOCK *cur_dir_block, char **route_names, int route_name_p, int route_cnt);

實現:

int recursive_dirinfo(SIFS_DIRBLOCK *cur_dir_block, char **route_names, int route_name_p, int route_cnt) {

for(int i=0; i《cur_dir_block-》nentries ; i++) {

int blockid = cur_dir_block-》entries[i].blockID;

if(bitmap[blockid]==SIFS_DIR) {

SIFS_DIRBLOCK dirblock;

int start = sizeof(SIFS_VOLUME_HEADER) + header.nblocks*sizeof(SIFS_BIT);

read_dir_block(vol, &dirblock, blockid * blocksize, start);

if(strcmp(dirblock.name, route_names[route_name_p]) == 0) {

if(route_name_p+2 == route_cnt) {

return do_read_file(cur_dir_block, route_names[route_name_p+1], blockid);

}

return recursive_dirinfo(&dirblock, route_names, route_name_p+1, route_cnt);

}

}

}

return 1;

}

以``。/sifs_put volumn ~/res.txt /dirB/subdirB/subsubdir/newfileB 為例子,如果遞歸找到 subsubdir`這個文件夾 block,進行相應操作:

?寫文件就往 bitmap 一直找沒有用過的 block,夠寫文件就寫進去,文件夾更新一下信息。

?讀文件就是根據此文件夾 block,找里面的 newfileB

int do_read_file(SIFS_DIRBLOCK *parent_dir, char *filename, int parent_dir_block) {

printf(“do_find_file_info, filename %s

”, filename);

for(int i=1; i《header.nblocks ; i++) {

SIFS_FILEBLOCK fileblock;

if(bitmap[i]==SIFS_FILE) {

int start = sizeof(SIFS_VOLUME_HEADER) + header.nblocks*sizeof(SIFS_BIT);

read_file_block(vol, &fileblock, i * blocksize, start);

*nbytes = fileblock.length;

int need_data_blocks = *nbytes / header.blocksize;

if(strcmp(fileblock.filenames[0], filename) == 0) {

for(int d_block_id = fileblock.firstblockID; d_block_id - i -1 《 need_data_blocks; d_block_id++) {

read_data_block(vol, (char*)(*data)+(d_block_id - i -1), blocksize, d_block_id * header.blocksize, start);

}

return 0;

}

}

}

return 1;

}

而真實的 tar 自然更復雜,還要記錄用戶權限、用戶、group文件等等:

struct posix_header

{ /* byte offset */

char name[100]; /* 0 */ 文件名

char mode[8]; /* 100 */ 用戶權限

char uid[8]; /* 108 */ user id

char gid[8]; /* 116 */ group id

char size[12]; /* 124 */ 文件大小

char mtime[12]; /* 136 */ 修改時間

char chksum[8]; /* 148 */ 校驗值

char typeflag; /* 156 */ 文件類型標志

char linkname[100]; /* 157 */ 符號鏈接指向

char magic[6]; /* 257 */

char version[2]; /* 263 */

char uname[32]; /* 265 */ user name

char gname[32]; /* 297 */ group name

char devmajor[8]; /* 329 */ 設備文件 major

char devminor[8]; /* 337 */ 設備文件 minor

char prefix[155]; /* 345 */

/* 500 */

};

文件類型標志定義,包含了所有 Unix 系統中的文件類型

#define REGTYPE ‘0’ /* regular file */

#define LNKTYPE ‘1’ /* link */

#define SYMTYPE ‘2’ /* reserved */

#define CHRTYPE ‘3’ /* character special */

#define BLKTYPE ‘4’ /* block special */

#define DIRTYPE ‘5’ /* directory */

#define FIFOTYPE ‘6’ /* FIFO special */

#define CONTTYPE ‘7’ /* reserved */

概覽如此,寫起來其實有點煩 - = -,有興趣的讀者可以寫寫。

原文標題:帶你寫一個 linux 下的打包軟件 tar

文章出處:【微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    88

    文章

    11758

    瀏覽量

    219009
  • 軟件
    +關注

    關注

    69

    文章

    5332

    瀏覽量

    91577

原文標題:帶你寫一個 linux 下的打包軟件 tar

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    linux的壓縮和解壓操作

    什么不同呢? 不同之處在于: 1) 一般情況,小文件使用gzip來壓縮,大文件使用bzip2來壓縮;2) bzip2 比 gzip 的壓縮率更高。 3、 目錄和多級目錄的解壓和壓縮用 tar
    發表于 12-23 06:56

    【飛凌OK-T153 開發板試用】SDK初試

    SDK初試 編繹環境 硬件: x86_64虛擬機 軟件: ubuntu 18.04 x64 SDK解壓 tar jxvf OKT153-linux-sdk.tar.bz2.0* >
    發表于 11-14 05:17

    你覺得哪個軟件verilog體驗最好?有什么優勢?

    你覺得哪個軟件verilog體驗最好?有什么優勢?請在評論區留言跟大家分享一吧。
    發表于 11-10 07:47

    Linux搭建平臺

    起因:本人用IDE感覺好不方便,所以配置了相關的Linux環境,Linx配置環境文檔看得有點亂,索性整理了一。 環境是zsh,用bash的可以稍微改一。主要下載了nuclei-sdk
    發表于 11-05 09:00

    linux中使用env時如何下載軟件包?

    在windows的env中可以直接使用pkgs —update去下載軟件包,Linux環境這個指令好像不生效,那么Linux環境
    發表于 10-11 09:23

    聊聊 Webpack 那些安全事兒:打包風險與防護小技巧

    Webpack 作為前端工程化的核心工具,幾乎成為現代 Web 應用打包的標配。它通過模塊合并、代碼壓縮、依賴管理等功能提升開發效率,但也因配置復雜、代碼混淆等特性,潛藏著諸多安全風險。本文結合實戰
    的頭像 發表于 09-02 10:22 ?730次閱讀
    聊聊 Webpack 那些安全事兒:<b class='flag-5'>打包</b>風險與防護小技巧

    FLASH燒/編程白皮書

    白皮書:如何燒Flash——不同場景不同需求的選擇認識Flash?NAND vs. NOR如何燒/編程不同方案比較
    發表于 07-28 16:05 ?0次下載

    linux環境 軟件啟動失敗怎么解決?

    anyway. /usr/lib/x86_64-linux-gnu/libproxy/libpxbackend-1.0.so: undefined symbol
    發表于 06-23 07:37

    打包機數據采集遠程監控系統方案

    在現代工業生產中,打包機作為產品包裝環節的關鍵設備,其穩定運行和高效管理對于企業的生產效率和產品質量至關重要。然而,傳統的打包機管理模式往往依賴人工巡檢和現場操作,存在數據采集不及時、設備狀態監控
    的頭像 發表于 05-28 13:52 ?585次閱讀
    <b class='flag-5'>打包</b>機數據采集遠程監控系統方案

    Linux文件系統打包及鏡像制作,觸覺智能RK3562開發板演示

    本文介紹Linux開發板文件系統打包及鏡像制作的方法,演示Linux文件系統打包及鏡像制作,適用于想將配置好的系統環境打包成鏡像批量燒錄。觸
    的頭像 發表于 04-28 16:45 ?999次閱讀
    <b class='flag-5'>Linux</b>文件系統<b class='flag-5'>打包</b>及鏡像制作,觸覺智能RK3562開發板演示

    rootfs鏡像制作其實沒那么難

    在嵌入式Linux開發中,文件系統的打包和鏡像制作是關鍵步驟。本文介紹了Linux核心板文件系統的打包與鏡像制作方法,適合嵌入式開發人員快速上手。前言致遠電子
    的頭像 發表于 04-03 11:37 ?1090次閱讀
    rootfs鏡像制作其實沒那么難

    LinuxVim編輯器的使用技巧

    【Vim】常用總結? 簡介? image 什么是vim?? Linux兩大編輯神器之一 vim ? Linux/Unix使用最多的編輯器 ? vi的改進版 ? 可能是最難上手的編輯
    的頭像 發表于 04-01 17:36 ?1422次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>下</b>Vim編輯器的使用技巧

    從零開始馴服Linux(一):ZYNQ-Linux啟動文件構建全解析

    信號處理、數據流控制等)放到FPGA中,剩下的操作交給ARM處理器執行。這樣,硬件和軟件可以無縫協同,優化整體系統效率;其次,運行Linux意味著可以使用Linux的豐富生態和開源資源。你可以利用大量
    發表于 03-20 16:48

    Linux固件燒中的陷阱:文件系統異步寫入引發的問題

    在工業生產中,固件燒是確保產品正常運行的關鍵環節。本文通過一個實際案例,揭示了Linux系統因文件寫入異步性導致的固件燒不完全問題。客戶案例客戶產線上批量生產時,用SD卡進行固件
    的頭像 發表于 03-07 11:34 ?833次閱讀
    <b class='flag-5'>Linux</b>固件燒<b class='flag-5'>寫</b>中的陷阱:文件系統異步寫入引發的問題

    openocd的.cfg的文件如何寫

    各位大佬們,最近想學習一openocd的.cfg的文件如何寫,各位大佬們,有什么入門學習的教程嗎?
    發表于 03-07 09:33