chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

3天內不再提示

RT-Smart應用開發(fā)筆記:fopen造成文件被清空問題的分析記錄

冬至子 ? 來源:張世爭 ? 作者:張世爭 ? 2023-10-20 16:01 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

RT-Smart 應用(apps)開發(fā)環(huán)境,ubuntu 20.04 + win10 VS Code

最近在調試一個問題,需要使用 FILE 的 fopen、fread 等去讀取處理一個大文件,為了盡快復現驗證問題,隨手搜了一下 fopen 等幾個 API的用法,調試時鬧出來一個【笑話】,程序運行所到之處,把處理過的本地文件清空了。

當時初步的目標只是使用 stat 去獲取一個文件的大小,現象就是 0

獲取文件大小

如何在 用戶態(tài)獲取文件大小,RT-Smart 的應用開發(fā)與 Linux 的用戶應用開發(fā)基本類似,Linux 平臺上的應用,可以輕松的移植到 RT-Smart 上。

fopen 可以在RT-Smart內核態(tài)使用,也可以在用戶態(tài)使用,用戶態(tài)的使用,一般都是借助 libc 與 系統(tǒng)調用,當前 RT-Smart 使用 musl gcc 工具鏈

獲取文件大小,應該與 fopen、fread 系列無關,代碼如下:

unsigned long get_file_size(const char *path)
{
unsigned long filesize = -1;
struct stat statbuff;
if (stat(path, &statbuff) < 0)
{
return filesize;
}
else
{
filesize = statbuff.st_size;
}
return filesize;
}

這里使用標準的 POSIX 接口 stat,頭文件 #include

測試代碼

隨手摘抄修改了一個測試代碼,想獲取到 文件大小,然后分批讀取,驗證這個過程是否正常,哪想到文件大小獲取為0,使用 qemu 調試了多遍,懷疑文件系統(tǒng)BUG,依舊未找到正確的思路

原 BUG 測試代碼如下:

/* read big file : > 300MB */
#include
#include
#include
#include
#include
#include
#include
#define BUFFER_SIZE (8 * 1024 * 1024)
unsigned long get_file_size(const char *path)
{
unsigned long filesize = -1;
struct stat statbuff;
if (lstat(path, &statbuff) < 0)
{
return filesize;
}
else
{
filesize = statbuff.st_size;
}
return filesize;
}
int main(int argc, char **argv)
{
//int errno;
FILE *fp = NULL;
unsigned long so_far, signed_len;
const char *path = "/lib/libc.so";
char *buffer = NULL;
size_t size;
size_t file_size;
size_t rd_len;
if (argc > 1)
{
path = argv[1];
}
printf("filename path : %sn", path);
fp = fopen(path, "w+");
if (!fp)
{
printf("fopen failedn");
return -1;
}
buffer = malloc(BUFFER_SIZE);
if (!buffer)
{
printf("buffer alloc failedn");
return -1;
}
file_size = get_file_size(path);
printf("file size %ldn", file_size);
signed_len = file_size;
so_far = 0;
while (so_far < signed_len)
{
size = BUFFER_SIZE;
printf("so far is %lu, signed_len is %lu, size is %lun", so_far, signed_len, size);
if (signed_len - so_far < size)
size = signed_len - so_far;
printf("new size is %lun", size);
rd_len = fread(buffer, 1, size, fp);
printf("fread rd_len = %ldn", rd_len);
if ((rd_len != 0) && (rd_len != size))
{
printf("fread failed, rd_len = %ld, size = %ldn", rd_len, size);
fclose(fp);
free(buffer);
return -2;
}
so_far += size;
printf("fread so_far = %ldn", so_far);
}
fclose(fp);
free(buffer);
printf("fread big file test end!n");
return 0;
}

測試結果

文件大小 讀取 為 0

1.jpg

由于可以使用 qemu 來調試,我看看到底為何 大小為0,難道 打印的不對?

1.jpg

2.jpg

3.jpg

內核部分的 sys_stat 后面的調試就不放上來了,說明一個問題:文件獲取大小就是 0

回頭看下測試結果

好吧,我發(fā)現了文件系統(tǒng)BUG?讀取一下狀態(tài),文件大小就變?yōu)?0 了?

我多試讀取了幾個文件,文件大小真的變?yōu)榱?,包括 /lib/libc.so 這個默認文件

我在板子上試了一下,讀取了一下文件系統(tǒng)中的核心文件: rtthread.bin,哪想到,板子啟動不了,看了固件被【真正】清零0

1.jpg

趕快看看神奇的代碼

發(fā)現 BUG 了,原來在 獲取文件狀態(tài)前,有個 fopen 操作,并且使用了 "w+",就是這個問題

1.jpg

2.jpg

都是C 語言基礎薄弱惹的禍,記錄一下,以后得好好學習,正確理解,才能致用。

fopen 的 參數

當前發(fā)現 fopen 使用 “a+” 也不能獲取文件大小,二進制的文件,需要使用 “rb”

1.jpg

正常使用了 fopen 后,文件大小就正常獲取了

1.jpg

看來測試代碼,也需要認真寫,測試過程中【看似無關緊要】的代碼,也許就是個【地雷】

小結

以上記錄,其實就是 fopen 參數的使用方法的一個記錄,寫這么多,就是增加【印象】,得到【教訓】,防止編寫此類BUG 的事情不再重復犯。

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

    關注

    2

    文章

    809

    瀏覽量

    42785
  • C語言
    +關注

    關注

    183

    文章

    7642

    瀏覽量

    144519
  • RT-Thread
    +關注

    關注

    32

    文章

    1534

    瀏覽量

    44223
  • Ubuntu系統(tǒng)

    關注

    0

    文章

    93

    瀏覽量

    4521
  • gcc編譯器
    +關注

    關注

    0

    文章

    78

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    通過Uboot?TFTP啟動rt-smart內核

    介紹Windows下通過 Uboot??TFTP 方式下載和啟動rt-smart 內核
    的頭像 發(fā)表于 06-30 12:34 ?4767次閱讀
    通過Uboot?TFTP啟動<b class='flag-5'>rt-smart</b>內核

    RT-Smart開發(fā)筆記:int類型數值溢出造成的奇怪問題的分析與排查記錄

    最近在調試 RT-Smart 上的用戶態(tài) mq(消息隊列)時,遇到一個奇怪的問題,這個例程打印了一下獲取的時間,就可以正常的工作(超時退出),否則,就一直卡?。o法超時)
    的頭像 發(fā)表于 10-31 16:16 ?1376次閱讀
    <b class='flag-5'>RT-Smart</b><b class='flag-5'>開發(fā)筆記</b>:int類型數值溢出<b class='flag-5'>造成</b>的奇怪問題的<b class='flag-5'>分析</b>與排查<b class='flag-5'>記錄</b>

    RT-Smart的資料合集

    基礎,講解 RT-Smart 的啟動過程。內核地址空間RT-SmartRT-Thread 的一大區(qū)別是用戶態(tài)和內核態(tài)的地址空間隔離開來。內核運行在內核地址空間,用戶進程運行在用
    發(fā)表于 03-22 15:06

    rt-smart中斷阻塞問題是怎么引起的

    跟蹤發(fā)現,阻塞原因是lwp_console.c文件里,打印消息前,中斷關閉了。然而rt_device_write()恰恰是一個阻塞型的發(fā)送,這就造成了中斷的長時間延誤,影響了OS整體
    發(fā)表于 03-25 09:56

    請問rt-smart gdbserver是閉源的嗎?

    編譯“RT-Smart”,啟用RT_USING_GDBSERVER時,發(fā)現許多文件都找不到,請問這部分代碼不公開嗎?比如#include #include
    發(fā)表于 04-19 09:37

    請問rt-smart gdbserver是閉源的嗎?

    編譯“RT-Smart”,啟用RT_USING_GDBSERVER時,發(fā)現許多文件都找不到,請問這部分代碼不公開嗎?比如#include #include
    發(fā)表于 04-26 10:01

    D1哪吒開發(fā)rt-smart內核固件的燒寫與運行步驟

    的windows的燒寫工具:PhoenixSuit.exe,選擇 打包好的rt-smart鏡像文件:PhoenixSuit.exe哪吒開發(fā)板斷電, 按住 按鍵【FEL】,USB 插入 【OTG】的 USB
    發(fā)表于 06-17 11:06

    開機體驗rt-smart:webserver網關

    軟件代碼交叉編譯成目標系統(tǒng)平臺可以運行的庫或二進制文件,作為 rt-smart 的一個用戶 APP,并在 ART-Pi Smart 開發(fā)板上運行。用戶也可以根據 文檔下面的章節(jié) “用
    發(fā)表于 06-30 11:17

    樹莓派上rt-smart的應用編程入門

    我們從現在開始會逐步連載RT-Thread Smart(簡稱rt-smart,甚至有時會稱為smart os)的介紹文章,旨在讓大家認識,接觸到sm
    的頭像 發(fā)表于 05-13 14:10 ?4028次閱讀
    樹莓派上<b class='flag-5'>rt-smart</b>的應用編程入門

    rt-smart移植分析:從樹莓派3b入手

    移植rt-smart到最新的板子上具體需要注意哪些細節(jié),哪些才是移植rt-smart的關鍵點?本文從樹莓派3b上移植rt-smart的角度,從頭分析
    發(fā)表于 01-25 18:48 ?0次下載
    <b class='flag-5'>rt-smart</b>移植<b class='flag-5'>分析</b>:從樹莓派3b入手

    優(yōu)雅的在D1S上運行RT-Smart

    前言 最近在學習 RT-Smart ,正巧有在全志開發(fā)者論壇看到這么一篇帖子【驚】在麻雀上運行國產rt-smart系統(tǒng),看到很多人都在關注 D1S 在 Smart 上的運行情況。如今該
    的頭像 發(fā)表于 11-16 20:15 ?3770次閱讀

    絲滑的在RT-Smart用戶態(tài)運行LVGL

    開發(fā)流程 1、RT-Smart 環(huán)境搭建 下載 RT-Smart 用戶態(tài)應用代碼: 1 git?clone?https: //github.com/RT-Thread/userapps
    的頭像 發(fā)表于 11-22 20:20 ?2054次閱讀

    RT-Smart riscv64匯編注釋

    rt-smart在全志D1上的代碼為例,主要注釋了rt-smart在riscv64上的系統(tǒng)初始化和異常處理的代碼倉庫地址https://gitee.com/rtthread/rt
    的頭像 發(fā)表于 02-08 21:40 ?1960次閱讀

    零基礎上手rt-smart適配bsp

    RT-Thread Smart(簡稱rt-smart)是基于RT-Thread操作系統(tǒng)衍生,面向帶MMU(Memory Management Unit),中高端應用的芯片,例如ARM
    的頭像 發(fā)表于 08-08 10:34 ?2099次閱讀
    零基礎上手<b class='flag-5'>rt-smart</b>適配bsp

    RT-Smart riscv64匯編注釋

    rt-smart在全志D1上的代碼為例,主要注釋了rt-smart在riscv64上的系統(tǒng)初始化和異常處理的代碼
    的頭像 發(fā)表于 10-12 17:26 ?1131次閱讀
    <b class='flag-5'>RT-Smart</b> riscv64匯編注釋