色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內(nèi)不再提示

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

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

前言

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

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

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

獲取文件大小

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

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

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

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 調(diào)試了多遍,懷疑文件系統(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;
}

測試結(jié)果

文件大小 讀取 為 0

1.jpg

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

1.jpg

2.jpg

3.jpg

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

回頭看下測試結(jié)果

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

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

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

1.jpg

趕快看看神奇的代碼

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

1.jpg

2.jpg

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

fopen 的 參數(shù)

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

1.jpg

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

1.jpg

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

小結(jié)

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

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

    關(guān)注

    2

    文章

    795

    瀏覽量

    41689
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7608

    瀏覽量

    137128
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1294

    瀏覽量

    40233
  • Ubuntu系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    91

    瀏覽量

    3995
  • gcc編譯器
    +關(guān)注

    關(guān)注

    0

    文章

    78

    瀏覽量

    3402
收藏 人收藏

    評論

    相關(guān)推薦

    通過Uboot?TFTP啟動rt-smart內(nèi)核

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

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

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

    RT-Smart的資料合集

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

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

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

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

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

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

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

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

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

    開機體驗rt-smart:webserver網(wǎng)關(guān)

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

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

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

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

    移植rt-smart到最新的板子上具體需要注意哪些細節(jié),哪些才是移植rt-smart的關(guān)鍵點?本文從樹莓派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ā)者論壇看到這么一篇帖子【驚】在麻雀上運行國產(chǎn)rt-smart系統(tǒng),看到很多人都在關(guān)注 D1S 在 Smart 上的運行情況。如今該
    的頭像 發(fā)表于 11-16 20:15 ?2914次閱讀

    絲滑的在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 ?1280次閱讀

    RT-Smart riscv64匯編注釋

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

    零基礎(chǔ)上手rt-smart適配bsp

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

    RT-Smart riscv64匯編注釋

    rt-smart在全志D1上的代碼為例,主要注釋了rt-smart在riscv64上的系統(tǒng)初始化和異常處理的代碼
    的頭像 發(fā)表于 10-12 17:26 ?630次閱讀
    <b class='flag-5'>RT-Smart</b> riscv64匯編注釋
    主站蜘蛛池模板: 簧片在线观看| 欧美6O老妪与小伙交| 日日啪在线影院百度| 成 人 片 免费播放| 三八成人网| 果冻传媒我的女老板| 中文字幕不卡一区二区三区| 女厕所边摸边吃奶边做爽视频| 成人永久免费视频| 亚洲精品123区在线观看| 久久精品亚洲AV中文2区金莲| a4you销魂gogo人体| 无码一区二区三区| 久久香蕉国产线看观看| jiucao在线观看精品| 性直播免费| 免费在线观看国产| 国产黄片毛片| 中文字幕精品AV内射夜夜夜| 日韩无码在线| 久久精品国产欧美日韩99热| 成 人 片 免费播放| 亚洲人成电影网站在线观看 | 久 久 亚洲 少 妇 无 码| 99精品视频在线观看免费| 无码人妻少妇色欲AV一区二区 | 天上人间影院久久国产| 露露的性战k8经典| 国产伦精品一区二区三区免费 | 久久99精品国产免费观看| xxx性欧美在线| 亚洲一区二区三区免费看 | 午夜电影三级还珠格格| 免费三级播放器| 国语自产视频在线| 插骚妇好爽好骚| 伊人久久大香线蕉综合影| 色男人综合| 女性爽爽影院免费观看| 精品国内自产拍在线观看视频| 高H短篇辣肉纯肉|