
linux应用程序开发
文章平均质量分 68
一些实用的linux应用程序开发笔记
最后一个bug
我是bug菌,一名嵌入式软硬件技术爱好者,我来csdn了~
展开
-
Linux文件挂载新文件夹,隐藏老文件夹问题
挂载到目录A会隐藏其原有子目录B/C,这是Linux文件系统的设计特性。若需保留原有内容,应避免直接挂载到非空目录,或改用其他方案(如挂载到子目录或使用联合文件系统)。原创 2025-03-20 16:12:06 · 78 阅读 · 0 评论 -
C11标准对于C语言的内存模型的描述
C11内存模型通过原子操作、内存顺序规则和线程支持,为多线程编程提供了标准化框架。它既保留了C语言的底层控制能力,又通过内存顺序参数实现了性能与正确性的灵活权衡,显著提升了并发程序的可移植性和可靠性。C11标准(ISO/IEC 9899:2011)对C语言的内存模型进行了重大改进,主要围绕多线程并发编程的规范化和安全性展开。允许编译器和硬件对非原子操作进行重排序,以提升性能,但需开发者通过同步操作(如锁、原子变量)显式控制可见性。通过原子操作和内存顺序规则,显式定义共享变量的访问顺序,消除未定义行为。原创 2025-03-16 23:00:52 · 743 阅读 · 0 评论 -
C语言为例谈数据依赖性
在存在数据依赖的情况下,编译器或处理器会保证这些操作的执行顺序,因此不需要显式地使用内存屏障(Memory Barrier)。但在多线程环境下(共享内存),如果数据依赖跨越线程,可能需要显式同步机制(如内存屏障或原子操作)。数据依赖通过隐式的顺序约束避免了内存屏障的使用,但仅适用于单线程或原子操作/同步机制保护的多线程场景。现代处理器(如x86、ARM)的乱序执行(Out-of-Order Execution)会动态检测数据依赖,并保证依赖操作的顺序。// 数据依赖:index 的值影响内存访问地址。原创 2025-03-14 00:15:33 · 288 阅读 · 0 评论 -
一个简化版的进程内通信库实现
该实现约200行代码,体现了ZeroMQ的核心思想,可根据需求进一步扩展功能。以下是一个简化版的进程内通信库实现,支持类似ZeroMQ的。实际实现中可优化为引用计数,此处为简化版使用内存拷贝。仅依赖POSIX线程库,适用于多线程通信场景。使用互斥锁和条件变量实现生产者-消费者模型。PUSH/PULL模式。原创 2025-03-11 00:00:53 · 142 阅读 · 0 评论 -
linux的内存映射文件功能太强了~
内存映射文件(Memory-Mapped File)是一种将磁盘文件直接映射到进程虚拟地址空间的技术,允许程序像操作内存一样读写文件内容。内存映射文件通过消除冗余数据拷贝和简化访问逻辑,显著提升了处理大文件或频繁访问文件的效率。它在高性能计算、数据库、多媒体处理等领域广泛应用,但需谨慎处理同步、错误和资源管理问题。大文件性能 高效(按需加载) 可能因频繁缓冲降低性能。跨进程共享 天然支持 需额外机制(如管道、共享内存)代码复杂度 低(指针操作) 高(需管理读写位置)原创 2025-03-09 11:01:47 · 715 阅读 · 0 评论 -
用C语言编写的ZeroMQ inproc线程通信库
这个实现展示了ZeroMQ inproc的核心用法,可以作为构建更复杂线程通信系统的基础。原创 2025-03-08 18:53:09 · 125 阅读 · 0 评论 -
linux条件变量用于线程通信
条件变量是Linux多线程编程中实现线程通信与同步的核心机制,其核心作用在于协调线程间的执行顺序,避免忙等待(busy-waiting)带来的资源浪费。如网页6的示例,主线程每生成四次任务后通过条件变量触发子线程执行,实现周期性协作^6。实现阻塞等待,该函数会自动释放关联的互斥锁并挂起线程,直至其他线程触发信号。例如,网页8的代码中,生产者填充共享数组后触发信号,消费者在条件变量上等待数据可用。线程池中,当无可用资源时,工作线程通过条件变量挂起,直到资源释放后被唤醒。设置等待超时,防止线程永久阻塞。原创 2025-03-08 18:49:52 · 378 阅读 · 0 评论 -
makefile中采用echo进行调试
printf “多行变量:\n$(MULTILINE_VAR)\n”立即展开变量: Tue Jun 1 12:00:00 UTC 2024。@echo “命令行传入的变量: $(OVERRIDE_VAR)”@echo “立即展开变量: $(IMMEDIATE_VAR)”@echo “特殊变量: $(SPECIAL_VAR)”@echo “延迟展开变量: $(LAZY_VAR)”@echo “调试 VAR的值是: $(VAR)”@echo “变量值: $(VAR)”@echo “变量值: $VAR”原创 2025-03-05 23:37:10 · 491 阅读 · 0 评论 -
在Linux实时任务中,锁的使用需要谨慎
因此,在Linux实时任务中使用锁要充分考虑其对实时性的影响,通过合理的设计和选择合适的锁机制及协议来尽量减少负面影响,以满足实时任务的要求。在Linux实时任务中,锁的使用需要谨慎,但不能说完全不适合用锁。原创 2025-03-04 12:29:58 · 315 阅读 · 0 评论 -
一种事件驱动的设计模式-Reactor 模型
Reactor 模型通过。原创 2025-03-03 19:22:33 · 928 阅读 · 0 评论 -
linux的tc工具设置和检测的属于软件层主动丢包
是 Linux 系统中的一个工具,全称是 Traffic Control,用于管理和控制网络流量的行为(如带宽限制、优先级调度、延迟模拟、丢包控制等)。根据 QoS 规则主动丢弃数据包时,这是由内核的流量控制逻辑直接处理的,属于 软件层的主动丢包,因此不会被网卡统计捕获。的规则作用于 内核协议栈的更高层(网络层或传输层)。)将流量分配到不同的队列(如基于 IP、端口、协议等)。队列),保障关键业务(如 VoIP)的低延迟。网卡(物理或虚拟网卡)的统计信息(如。的更多背景),请补充说明!原创 2025-03-01 10:36:01 · 376 阅读 · 0 评论 -
ARMv8架构缓存一致性协议同步速度评估
在 ARMv8 多核系统中,缓存一致性协议(如 MOESI)通常会在极短时间内(纳秒到微秒级)完成数据同步,因此 延迟超过 1ms 的概率极低。缓存一致性同步 10~1000 纳秒 通过总线协议(如 ACE)在多核间同步缓存行(典型值约 100~500 纳秒)。极端缓存争用 微秒级 多个核心频繁修改同一缓存行(False Sharing),导致总线带宽饱和。系统中断/调度延迟 微秒~毫秒级 高优先级中断抢占 CPU,或线程被操作系统调度挂起。)实测具体场景的延迟分布。一、正常情况下的延迟范围。原创 2025-03-01 09:24:53 · 173 阅读 · 0 评论 -
CPU认为什么情况下两条指令没有依赖而进行乱序执行
数据无关(操作数独立或 WAR 伪依赖)、名称无关(通过寄存器重命名或内存地址不重叠)、控制无关(分支预测下的推测执行)、内存模型允许的宽松顺序(如 Store-Load 重排)。理解这些场景对编写高性能并发代码至关重要,尤其在多线程、锁无关(Lock-Free)编程或硬件交互(如驱动开发)时,需通过内存屏障或原子操作显式控制执行顺序。原创 2025-02-24 16:23:24 · 527 阅读 · 0 评论 -
linux的CPU乱序问题需要考虑内存屏障
在 Linux 应用程序开发中,是否显式使用内存屏障取决于具体场景。大多数开发者不会直接操作内存屏障,而是依赖更高级的同步机制(如锁、原子操作或标准库提供的线程安全抽象)。但在某些特定场景下,内存屏障是必须的。应用开发者 极少显式使用 依赖高级同步原语(如锁、原子操作),无需关心底层细节。系统开发者 较频繁(如内核、驱动、无锁库) 需要直接控制硬件或实现底层同步机制。嵌入式开发者 中低频(依赖架构) 在操作寄存器或跨核通信时需插入屏障。(2) 示例:使用原子操作避免手动屏障。原创 2025-02-24 00:56:09 · 290 阅读 · 0 评论 -
手把手教你linux下使用objdump反汇编
是一个用于分析二进制文件(如目标文件、可执行文件、静态库、共享库等)的实用工具。它属于 GNU Binutils 套件,能够显示二进制文件的详细信息,包括反汇编代码、段结构、符号表、重定位条目等。objdump -d <二进制文件> | grep -A20 “<函数名>”,开发者可以深入理解二进制文件的底层结构,是分析、调试和逆向工程的必备工具。objdump -m <架构> -d <二进制文件>(5) 显示动态符号表(用于动态链接库)(2) 显示段(Section)信息。(6) 显示重定位信息。原创 2025-02-23 11:21:10 · 1096 阅读 · 0 评论 -
linux中把文件系统加载到内存中执行
在 Linux 内核中,将文件系统加载到 内部 RAM 中运行(即使用 RAM 作为根文件系统的存储介质)通常有两种方法:initramfs 和 RAM Disk(ramdisk)。通过上述方法,可以在 Linux 内核中轻松实现将文件系统加载到内部 RAM 中运行,适用于嵌入式系统快速启动或临时调试环境。它比传统 ramdisk 更轻量,无需预先分配固定大小的块设备。initramfs 是一个基于内存的初始根文件系统,内核启动时将其解压到。RAM Disk 将文件系统镜像加载到内存中的块设备(如。原创 2025-02-23 01:35:43 · 746 阅读 · 0 评论 -
stm32mp采用spi接口扩展can
在 STM32MP 系列微处理器中,通过 SPI 转 CAN 功能扩展 CAN 接口需要结合硬件设计(如使用 SPI 接口的 CAN 控制器芯片)和 Linux 驱动配置。// 片选引脚(根据硬件设计调整)实际应用中需根据硬件设计调整设备树和驱动参数,确保 SPI 时序和中断配置正确。重新编译内核或模块,部署到 STM32MP 目标板。接收 CAN 数据(终端1)发送 CAN 数据(终端2)配置 CAN 接口参数。原创 2025-02-23 00:22:35 · 661 阅读 · 0 评论 -
Swupdate升级不强制依赖version字段
(echo “$SWUPDATE_ARGS” | jq -r ‘.version’) 从 sw-description 提取版本。字段在升级流程中是一个重要的信息标识符,通常需要开发者结合自身逻辑(如版本比较、兼容性检查)来实现版本控制。通过合理设计版本管理逻辑,可以避免重复升级、控制兼容性,并实现灵活的固件发布策略。“version”: “2.1.0”, // 声明升级包版本。exit 1 退出并终止升级。字段来决定是否执行升级,但。3.2 在服务器端控制版本推送。原创 2025-02-19 22:50:23 · 573 阅读 · 0 评论 -
swupdate升级的核心机制
SwUpdate(Software Update)的核心升级机制围绕安全、可靠、原子性展开,专为嵌入式系统设计,确保在资源受限的环境中实现无风险的固件更新。SwUpdate 通过上述机制,在工业控制、物联网、汽车电子等领域实现了安全、可靠、无感知的固件升级。根文件系统更新 分区级刷写(A/B 切换) 原始分区写入 + 引导标志切换。将待升级的组件(内核、文件系统、应用程序等)打包为。文件声明镜像内容、目标设备、依赖关系和安全策略。格式的镜像,支持全量或差分更新。内核更新 文件级替换。原创 2025-02-19 22:35:51 · 844 阅读 · 0 评论 -
swupdate升级文件系统内文件与分区的差异
device”: “/dev/mmcblk0p3”, // 目标分区(如备用分区B)“filename”: “boot/Image.gz”, // 升级包内的文件路径。“device”: “/dev/mmcblk0p2”, // 根文件系统所在分区。“path”: “/boot/Image.gz”, // 目标文件路径。“device”: “/dev/mmcblk0p2”, // 目标分区。“path”: “/”, // 挂载点。原创 2025-02-19 22:29:18 · 975 阅读 · 0 评论 -
使用Swupdate恢复模式更新嵌入式linux系统
在 SWUpdate 中,使用 恢复模式(Recovery Mode) 而不是 A/B 分区(A/B Seamless)模式 部署更新,通常需要以下步骤。恢复模式的核心思想是通过一个独立的恢复分区(或恢复系统)来管理更新,确保在主系统更新失败时能够回滚到已知的正常状态。主系统根文件系统分区。└── init 恢复系统的初始化脚本。如果需要进一步优化,可以结合。或自定义脚本增强可靠性。)中,指定镜像类型为。(2) 配置镜像类型。原创 2025-02-18 23:20:02 · 979 阅读 · 0 评论 -
STM32MP2 系列 RIF 资源隔离框架使用教程
RIF就像是STM32MP2系列芯片的“安全卫士”,能把芯片里不同的运行区域隔离开,保护内部内存、外部内存和内部外设不被随意访问。在芯片这个“小世界”里,不同的程序和设备就像不同的“居民”,RIF确保每个“居民”只能在自己的“地盘”活动,不能随便闯入别人的区域捣乱。原创 2025-02-17 11:37:10 · 731 阅读 · 0 评论 -
网络字节序与转换
系统兼容性和互操作性方面。性能优化和资源利用方面。跨平台和可移植性方面。原创 2025-02-15 17:04:56 · 315 阅读 · 0 评论 -
深入剖析Linux下malloc的线程安全性
如果此时 malloc 正在进行一些关键操作,比如调整内存池的结构,信号处理函数中的 malloc 调用可能会破坏 malloc 的内部数据结构,导致程序崩溃或出现其他不可预测的错误。例如,线程A在自己的内存池中进行内存分配操作,无论线程B同时在做什么,都不会干扰到线程A的操作,极大地提高了并发性能。在Linux下多线程编程中, malloc 虽然是线程安全的,但我们作为开发者,需要深入理解其工作原理,合理使用,才能在复杂的多线程环境中充分发挥其优势,避免潜在的问题,编写出健壮、高效的多线程程序。原创 2025-02-15 11:12:09 · 372 阅读 · 0 评论 -
stm32mp集成swupdateOTA升级
通过以上步骤,可以在STM32MP257上实现稳定可靠的OTA更新。具体实现时需参考ST官方文档和。实现OTA(Over-The-Air)更新需要结合硬件分区管理、系统镜像构建和。官方指南,结合开发板的硬件特性调整参数。使用Yocto构建系统时,需添加。在STM32MP257上集成。原创 2025-02-14 12:34:03 · 891 阅读 · 0 评论 -
linux启动命令函参数解读(基于STM32MP2)
查看linux启动参数 cat /proc/cmdline。原创 2025-01-14 11:12:46 · 379 阅读 · 0 评论 -
linuxC语言从Http服务器上获得文件
在Linux环境下使用C语言从HTTP服务器获取文件,可以借助libcurl库来实现。libcurl是一个功能强大的开源库,支持多种协议,包括HTTP。以下是一个简单的示例代码,展示了如何使用libcurl。原创 2025-01-07 19:22:43 · 334 阅读 · 0 评论 -
嵌入式Linux使用SWUpdate升级
在嵌入式Linux系统中,SWUpdate是一个功能强大的软件更新工具,可用于设备的固件升级等操作。原创 2025-01-07 19:21:31 · 1099 阅读 · 0 评论 -
在C语言中使用伪终端与bash交互
这样,通过上述代码,你可以在C语言程序中使用伪终端与。原创 2025-01-03 13:44:04 · 564 阅读 · 0 评论 -
使用systemd采用.service文件方式启动的应用程序在后台执行
当使用systemd通过.service文件启动应用程序时,应用程序默认没有与传统意义上的终端直接关联。原创 2025-01-03 11:27:21 · 676 阅读 · 0 评论 -
linux进程与终端的关系
在Linux系统中,进程与终端有着紧密且复杂的关系,这种关系影响着进程的启动、控制和运行环境。原创 2025-01-03 09:00:55 · 320 阅读 · 0 评论 -
解决linux自启程序无法在终端输出问题
在System V初始化系统中,自启应用程序通过printf。原创 2025-01-02 00:10:15 · 380 阅读 · 0 评论 -
linux命令中cp命令-rf与-a的差别
在Linux系统中,cp命令用于复制文件和目录。cp -rf和cp -a。原创 2024-12-25 22:22:12 · 1525 阅读 · 0 评论 -
rt-linux中使用mlockall与free的差异
后,动态申请内存的释放逻辑与常规情况一致,但物理内存的释放会受到锁定状态的影响。在使用完毕后,应适时调用。后,动态申请的内存并非绝对得不到释放,但与常规内存释放相比,存在一些特殊情况和注意事项。释放锁定的物理内存,以确保系统内存资源的合理利用。原创 2024-12-24 15:08:27 · 311 阅读 · 0 评论 -
解读Makefile中,`=`、`:=`、`?=` 和 `+=`差异
在Makefile中,:=?和+=是用于定义和操作变量的不同赋值运算符,它们各自有其特点和用途。原创 2024-12-23 22:19:10 · 450 阅读 · 0 评论 -
linux top命令刷新速度的原理
【代码】linux top命令刷新速度的原理。原创 2024-12-21 23:40:25 · 417 阅读 · 0 评论 -
解读下/etc/systemd/timesyncd.conf
详细解读下。原创 2024-12-20 14:20:51 · 711 阅读 · 0 评论 -
gdb逆向调试功能太强了~
总结:通过获取栈指针地址,然后在该地址上设置数据断点(观察点),就可以在栈上设置断点了。这样,当程序执行到改变该栈地址上数据的操作时,GDB就会暂停程序执行,以便你进行调试。“set can - use - hw - watchpoints 0”命令和软件断点。反向调试与硬件数据断点失效。在RSP地址设置数据断点。原创 2024-12-08 23:04:38 · 763 阅读 · 0 评论 -
什么是linux实时性以及如何测量
Linux实时性是指Linux系统能够在限定的时间内对外部事件做出响应的特性。原创 2024-12-06 12:35:27 · 376 阅读 · 0 评论 -
gcc中-rdynamic参数的作用
【代码】gcc中-rdynamic参数的作用。原创 2024-11-23 09:35:44 · 365 阅读 · 0 评论