
大家好,我是情报小哥~
在嵌入式Linux开发中,/tmp目录往往被开发者忽略,但其作为系统默认的临时目录,在资源受限的嵌入式场景下,凭借灵活、高效的特性,能解决诸多实际开发难题。与桌面或服务器系统不同,嵌入式设备多采用Flash、eMMC等闪存作为持久存储,频繁写入会加速闪存损耗,而/tmp目录通常挂载为tmpfs(内存文件系统),数据存储于RAM中,既保证了极高的读写速度,又能避免对闪存的磨损,用过的都说香。
下面,我结合下我自身项目和了解,拆解/tmp目录的实用妙用。
在嵌入式设备的OTA升级或本地固件更新时,需先下载固件包、完成完整性校验,再写入系统分区,若直接写入闪存,校验失败会导致闪存污染,且写入速度较慢。

那我们为啥不考虑这样的方法呢?将下载的固件包(如firmware.bin)临时存储至/tmp目录,例如/tmp/firmware.bin,通过MD5校验、签名验证等方式确认固件完整性后,再解压或写入Flash分区。
这样操作是在内存级读写速度大幅缩短升级耗时;校验失败可直接删除/tmp下的固件文件,不会污染闪存;若升级中途断电,/tmp目录内容自动消失,避免残留不完整文件导致系统异常。
我们有时候在开发阶段需频繁打印应用程序日志、内核调试信息,若直接写入闪存中的日志文件,频繁擦写会加速闪存损耗,且日志读取效率较低。
可以在将应用日志输出路径配置为/tmp/app.log,或通过syslog配置,将核心调试日志定向输出至/tmp目录下;开发人员可通过串口、网络工具(如scp)实时读取/tmp下的日志文件,快速定位问题。
这样就彻底避免闪存磨损,调试结束后重启设备即可自动清空日志,无需手动清理;实时读取速度快,提升调试效率。
在嵌入式系统中多个进程需交换数据(如后台服务与前端界面、传感器采集进程与数据分析进程),使用文件作为通信媒介时,需兼顾速度与清理便利性。
比如在/tmp目录下创建共享数据文件(如/tmp/shared_state),供多个进程读写共享数据;或创建Unix Domain Socket文件(如/tmp/mysocket.sock),实现进程间的高效通信。
这样就可以借助tmpfs的低延迟特性保证了进程间数据交换的实时性;系统重启后,/tmp下的socket文件、共享文件自动清理,避免残留文件干扰进程重启后的正常运行。
值得提一点的是:/tmp目录默认开启粘滞位(sticky bit),即只有文件所有者、root用户可删除文件,一定程度上保证了文件安全性,但多个进程读写同一文件时,仍需做好同步控制(如使用flock文件锁),避免出现数据错乱、文件损坏等问题。
比如我们有这样场景:摄像头采集、音频录制、实时数据分析等场景中,需临时缓存少量可变数据(如几帧图像、一段录音片段),要求读写速度快、无闪存磨损。
那可以在/tmp目录下创建循环缓冲区文件,实时写入采集到的可变数据,数据处理完成后立即删除,例如摄像头应用可在/tmp/camera_buf中缓存图像帧,分析完成后清空缓冲区。内存级读写速度满足实时性要求,适配嵌入式设备的高性能需求;避免频繁写入闪存导致的介质损坏,延长设备使用寿命。
这个不算是嵌入式设备上的应用,毕竟嵌入式设备资源受限,不过也算是利用/tmp目录一种典型方式,在linux上通过opkg、dpkg等软件包管理器安装、编译软件时,需临时解压安装包、存放编译中间文件,若直接在闪存中操作,会产生大量碎片写入。
做法:软件包管理器会自动将安装包解压至/tmp目录下的临时文件夹(如/tmp/opkg-tmp),完成文件解压、依赖检查后,再将文件移动至目标安装路径。
这样的话解压、编译过程在内存中完成,减少对闪存的碎片写入,避免闪存碎片化导致的存储效率下降;临时文件自动清理,不占用持久存储空间。
这是我们调试程序经常用到的,应用程序崩溃时,系统会生成core dump文件(包含进程崩溃时的内存状态、寄存器信息),用于定位崩溃原因,若直接存储至闪存,会占用有限的闪存空间,且不易清理。
可以通过系统配置(如修改/proc/sys/kernel/core_pattern),将core dump文件输出至/tmp目录,例如配置为/tmp/core.%e(%e表示崩溃的应用程序名称),调试完成后,重启设备即可自动清空。
在开发过程中,需测试新的文件系统镜像、临时访问U盘等外部存储设备,若在根文件系统中创建固定挂载目录,会占用持久存储资源,且易残留挂载痕迹。
做法:在/tmp目录下创建临时挂载点(如/tmp/mnt),通过mount命令挂载U盘、文件系统镜像,操作完成后卸载挂载点,无需保留固定目录。
这样做的好处就是保持根文件系统整洁,无需预先分配固定挂载目录;临时挂载的设备或镜像操作完成后,删除挂载点即可,不影响系统原有配置。
设备的后台监控脚本(如CPU、内存、网络连接状态监控),需周期性收集系统状态,供Web管理界面或其他进程读取,频繁写入闪存会影响系统性能。
我们可以监控脚本每分钟将系统状态(如CPU使用率、内存占用、网络连接数)写入/tmp目录下的JSON文件(如/tmp/status.json),Web服务或其他进程直接读取该文件获取状态信息。
这样就避免频繁调用系统命令查询状态,降低系统开销;内存文件的高速读写的特性,保证状态信息的实时更新,且无需清理历史数据。
最后一句话: /tmp目录核心价值在于“高效读写、避免闪存磨损、自动清理”。
小哥搜集了一些嵌入式学习资料,公众号内回复【1024】即可找到下载链接!
推荐好文点击蓝色字体即可跳转
☞专辑|Linux应用程序编程大全 ☞ 专辑|学点网络知识 ☞ 专辑|手撕C语言 ☞ 专辑|手撕C++语言
☞ 专辑|经验分享 ☞ 专辑|从单片机到Linux ☞ 专辑|电能控制技术 ☞ 专辑|嵌入式必备数学知识 ☞ MCU进阶专辑
☞ 经验分享