在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

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

冬至子 ? 來源:張世爭 ? 作者:張世爭 ? 2023-10-20 16:01 ? 次閱讀

前言

RT-Smart 應用(apps)開發環境,ubuntu 20.04 + win10 VS Code

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

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

獲取文件大小

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

fopen 可以在RT-Smart內核態使用,也可以在用戶態使用,用戶態的使用,一般都是借助 libc 與 系統調用,當前 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 調試了多遍,懷疑文件系統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

回頭看下測試結果

好吧,我發現了文件系統BUG?讀取一下狀態,文件大小就變為 0 了?

我多試讀取了幾個文件,文件大小真的變為了0,包括 /lib/libc.so 這個默認文件

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

1.jpg

趕快看看神奇的代碼

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

1.jpg

2.jpg

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

fopen 的 參數

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

1.jpg

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

1.jpg

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

小結

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

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

    關注

    2

    文章

    795

    瀏覽量

    41668
  • C語言
    +關注

    關注

    180

    文章

    7605

    瀏覽量

    136965
  • RT-Thread
    +關注

    關注

    31

    文章

    1291

    瀏覽量

    40187
  • Ubuntu系統
    +關注

    關注

    0

    文章

    91

    瀏覽量

    3962
  • gcc編譯器
    +關注

    關注

    0

    文章

    78

    瀏覽量

    3387
收藏 人收藏

    評論

    相關推薦

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

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

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

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

    RT-Smart的資料合集

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

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

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

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

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

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

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

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

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

    開機體驗rt-smart:webserver網關

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

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

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

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

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

    優雅的在D1S上運行RT-Smart

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

    絲滑的在RT-Smart用戶態運行LVGL

    開發流程 1、RT-Smart 環境搭建 下載 RT-Smart 用戶態應用代碼: 1 git?clone?https: //github.com/RT-Thread/userapps
    的頭像 發表于 11-22 20:20 ?1274次閱讀

    RT-Smart riscv64匯編注釋

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

    零基礎上手rt-smart適配bsp

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

    RT-Smart riscv64匯編注釋

    rt-smart在全志D1上的代碼為例,主要注釋了rt-smart在riscv64上的系統初始化和異常處理的代碼
    的頭像 發表于 10-12 17:26 ?625次閱讀
    <b class='flag-5'>RT-Smart</b> riscv64匯編注釋
    主站蜘蛛池模板: 国产精品国产三级在线高清观看| 欧美一区二区三区在线观看免费 | xxxxxxxxx18免费视频| 国产成人优优影院| 三级黄网站| 1v1高h肉爽文bl| 老湿影院免费体验区| 全免费午夜一级毛片真人| 大色视频| 久久久久久国产精品免费| 黄色的视频在线免费观看| 日本成人一级片| 性做久久久久久久免费看| 日本口工福利漫画无遮挡| 久久久久国产成人精品亚洲午夜| 精品爱爱| 日本黄色美女视频| 男人的天堂视频在线| 人人射人人干| 可以直接看的黄色网址| 国产成年女一区二区三区| 夜夜爽www| 精品在线一区二区| semimi亚洲综合在线观看| 88av免费观看| 国产香蕉在线视频| 青青伊人91久久福利精品| 久久福利精品| 亚洲一区二区三区高清| 一级特黄a大片免费| 人人狠狠综合88综合久久| 国产色丁香久久综合| 精品国产乱码久久久久久浪潮| 成人久久网| 免费一级片在线观看| 久久精品隔壁老王影院| 成人啪啪网站| 亚洲电影免费| 老逼影院| 手机看片1024福利| 欧美一级第一免费高清|