当前位置: 首页 > article >正文

Buildroot 增加系统启动项并解决后台无法获取输入(串口)

在这里插入图片描述

Buildroot 增加自启动项

  • 概述
  • 增加模块
  • 源码结构
  • 编写测试程序
  • 编译测试
  • 增加系统自启动
  • 一个问题
    • 解决方案:显式指定输入设备
  • 其他
    • /etc/init.d 目录下的 SXXxxx 文件作用解析‌

概述

Buildroot 是一款轻量级、高度可定制的开源工具集,专为嵌入式系统打造。它通过自动化构建流程(交叉编译工具链、Linux内核、根文件系统、引导程序),将复杂的嵌入式开发简化为“菜单配置”(make menuconfig)。开发者无需手动处理依赖与兼容性问题,只需勾选所需软件包,即可生成完整的可烧录镜像。在嵌入式场景中,服务进程的自动加载是刚需, 通常将启动脚本置于/etc/init.d/(SysV init)或编写systemd单元文件,实现服务的全自动托管。

增加模块

参考: Buildroot 添加自定义模块-内置文件到文件系统

–本文不再复述–

源码结构

package/auto_run/
├── CMakeLists.txt
├── Config.in
├── dumpsys.cpp
├── auto_run.mk
└── S99dumpsys

编写测试程序

dumpsys.cpp

#include <stdio.h>
#include <string.h>
#include <sys/statvfs.h>
#include <unistd.h>void print_memory() {FILE *meminfo = fopen("/proc/meminfo", "r");if (!meminfo) {printf("无法读取内存信息\n");return;}char line[256];unsigned long total_mem = 0, free_mem = 0;while (fgets(line, sizeof(line), meminfo)) {if (strncmp(line, "MemTotal:", 9) == 0) {sscanf(line + 9, "%lu", &total_mem);} else if (strncmp(line, "MemFree:", 8) == 0) {sscanf(line + 8, "%lu", &free_mem);}}fclose(meminfo);printf("可用内存: %lu MB / 最大内存: %lu MB\n", free_mem / 1024, total_mem / 1024);
}void print_disk() {struct statvfs stat;if (statvfs("/", &stat) != 0) {printf("无法读取磁盘信息\n");return;}unsigned long free_space = (stat.f_bfree * stat.f_frsize) / (1024 * 1024);unsigned long total_space = (stat.f_blocks * stat.f_frsize) / (1024 * 1024);printf("可用空间: %lu MB / 最大空间: %lu MB\n", free_space, total_space);
}int main() {char input[10];while (1) {printf("输入命令 (mem/disk/exit): ");if (!fgets(input, sizeof(input), stdin)) {continue;}// 移除换行符input[strcspn(input, "\n")] = 0;if (strcmp(input, "mem") == 0) {print_memory();} else if (strcmp(input, "disk") == 0) {print_disk();} else if (strcmp(input, "exit") == 0) {break;} else {printf("无效命令\n");}}return 0;
}

编译测试

编译完成后, 可以直接将dumpsys 程序拷贝到/usr/data/dumpsys运行测试:

# /usr/data/dumpsys 
输入命令 (mem/disk/exit): mem
可用内存: 397 MB / 最大内存: 447 MB
输入命令 (mem/disk/exit): exit

增加系统自启动

auto_run.mk

AUTO_RUN_SITE = $(TOPDIR)/package/auto_run
AUTO_RUN_SITE_METHOD = local
AUTO_RUN_INSTALL_STAGING = YES# dumpsys
define AUTO_RUN_INSTALL_INIT_SYSV$(INSTALL) -D -m 0755 $(AUTO_RUN_SITE)/S99dumpsys $(TARGET_DIR)/etc/init.d/S99dumpsys
endefAUTO_RUN_POST_INSTALL_TARGET_HOOKS += AUTO_RUN_INSTALL_INIT_SYSV$(eval $(cmake-package))

S99dumpsys

#!/bin/shcheck_run(){local file="/usr/data/dumpsys"local max_attempts=10local attempt=1while [ $attempt -le $max_attempts ]; doif [ -f "$file" ]; thenecho "File $file found, starting dumpsys..."/usr/data/dumpsys &return 0elseecho "Attempt $attempt: File $file not found, waiting..."sleep 1attempt=$((attempt + 1))fidoneecho "file not found and exit"return 1
}case "$1" instart)echo "Starting dumpsys..."check_run || exit 1;;stop)echo "Stopping dumpsys..."killall dumpsys;;restart)$0 stop$0 start;;*)echo "Usage: $0 {start|stop|restart}"exit 1;;
esacexit 0

一切准备就绪! 打包烧录!

一个问题

为了方便测试, 默认/usr/data/目录下没有dumpsys, 通过命令拷贝并重启.
意外出现:

输入命令 (mem/disk/exit): 输入命令 (mem/disk/exit): 输入命令 (mem/disk/exit): 输入命令 (mem/disk/exit): 输入命令 (mem/disk/exit): 输入命令 (mem/disk/exit): 输入命令 (mem/disk/exit): 输入命令 (mem/disk/exit): ...

循环输出LOG: 输入命令 (mem/disk/exit):
调试发现问题出在

if (!fgets(input, sizeof(input), stdin))

原因是从stdin读取输入出现了问题.

在Buildroot环境中,fgets()在通过init脚本启动时失败但在手动启动时正常,这通常与标准输入(stdin)的环境差异有关。

由于 后台运行(&)的影响

  • &使程序在后台运行,可能导致stdin被关闭或重定向
  • init系统可能进一步处理了标准流

解决方案:显式指定输入设备

修改程序代码:

FILE *input_stream = fopen("/dev/console", "r");
if (!input_stream) {input_stream = fopen("/dev/tty", "r");
}
if (!input_stream) {input_stream = stdin;
}if (!fgets(input, sizeof(input), input_stream)) {// 错误处理
}

根本原因是初始化环境和交互式shell环境的差异。在系统启动时,标准输入可能没有绑定到有效的终端设备,而手动启动时则会有完整的终端环境。

其他

/etc/init.d 目录下的 SXXxxx 文件作用解析‌

文件命名规则与核心作用‌

  • S 前缀‌:表示 ‌启动(Start)‌ 服务,与之对应的 K 前缀表示 ‌停止(Kill)‌ 服务‌。
    XX 数字‌:决定脚本执行顺序,数值小的优先执行(如 S10network 先于 S20apache 执行),用于解决服务间的依赖关系(例如网络接口需先于 Web 服务启动)‌。
    xxx 服务名‌:标识具体服务(如 S50ssh 表示 SSH 服务)。

  • SXXxxx 文件是 SysVinit/BusyBox 初始化系统中,通过数字排序和符号链接机制实现服务按需启动的核心配置单元,直接影响嵌入式设备或服务器在特定运行级别的服务状态‌。

相关文章:

Buildroot 增加系统启动项并解决后台无法获取输入(串口)

Buildroot 增加自启动项 概述增加模块源码结构编写测试程序编译测试增加系统自启动一个问题解决方案&#xff1a;显式指定输入设备 其他/etc/init.d 目录下的 SXXxxx 文件作用解析‌ 概述 Buildroot 是一款轻量级、高度可定制的开源工具集&#xff0c;专为嵌入式系统打造。它通…...

【Javaweb】b站黑马视频学习笔记

Javaweb学习导览 1.Mysql...

使用ThreadLocal可能导致内存泄漏的原因与其底层实现机制

学海无涯&#xff0c;志当存远。燃心砺志&#xff0c;奋进不辍。 愿诸君得此鸡汤&#xff0c;如沐春风&#xff0c;事业有成。 若觉此言甚善&#xff0c;烦请赐赞一枚&#xff0c;共励学途&#xff0c;同铸辉煌&#xff01; 首先&#xff0c;ThreadLocalThreadLocal的基本原理。…...

OpenHarmony和HarmonyOS到底有什么区别?

HarmonyOS 与 OpenHarmony差异化剖析 背景介绍 HarmonyOS 是华为的闭源商业操作系统&#xff0c;旨在为智能手机、平板和 IoT 设备提供统一的用户体验。而 OpenHarmony 是其开源版本&#xff0c;适合开发者定制各种设备系统。两者共享部分代码&#xff0c;但 API 差异反映了各…...

HTML5 MathML 学习笔记

一、什么是MathML MathML&#xff08;Mathematical Markup Language&#xff09;是一种数学标记语言&#xff0c;用于在互联网上书写数学符号和公式。MathML是一种基于XML的标准&#xff0c;可以用来描述复杂的数学公式和符号&#xff0c;使其能够在网页上正确显示。 MathML的…...

数据库取证分析

目录 一.多表关联 1.一对多联结 2.子查询 二.数据库示例分析 1.多表关联 三.选择SQL分析的原因 四.数据库概述 五.SQL语言 一.多表关联 1.一对多联结 2.子查询 二.数据库示例分析 1.多表关联 三.选择SQL分析的原因 四.数据库概述 五.SQL语言 1.select 字段...

MATLAB 批量移动 TIF 文件至分类文件夹

文章目录 前言一、步骤二、代码 前言 本代码用于从指定的源文件夹 (sourceFolder) 中筛选所有 .tif 文件&#xff0c;并根据文件名的特定关键词&#xff08;Daynight 和 FDI&#xff09;将其分类移动到相应的目标文件夹 (targetDaynightFolder 和 targetFDIFolder)。 一、步骤…...

【深度技术揭秘】 Android SystemUI锁屏界面动态布局重构:横竖屏智能适配指南

1. 问题背景与需求拆解 在Android 13系统定制中&#xff0c;发现平板横屏锁屏界面存在两大视觉问题&#xff1a; 时钟控件尺寸过大&#xff0c;与竖屏样式不统一 解锁图标位置异常&#xff0c;横向居中而非顶部居中&#xff08;如图示&#xff09; 需实现&#xff1a; 横竖屏…...

ESG评级认可性及市场现状分析

ESG评级的认可性是指评级结果在市场上的接受程度和权威性&#xff0c;它直接影响投资者、企业、监管机构等利益相关方对ESG表现的信任和依赖程度。以下是影响ESG评级认可性的关键因素及当前市场现状的分析&#xff1a; 1. 评级机构的权威性 ESG评级的认可性首先取决于评级机构…...

模型解释与可解释AI实战

‌一、为什么需要模型解释&#xff1f;‌ 模型解释技术帮助&#xff1a; 理解模型决策依据&#xff08;特征重要性&#xff09;调试模型错误预测满足监管合规要求&#xff08;金融/医疗&#xff09;提升用户对AI的信任 本章使用Captum实现CV/NLP模型的可视化解释 ‌二、环境…...

1、pytest基本用法

目录 先给大家分享下学习资源 1. 安装pytest 2. 编写用例规则 3. 执行用例 最近在学习pytest的用法 并且用这套框架替换了原来的unittest&#xff0c; 同是测试框架 确实感觉到pytest更加便捷 这边分享给大家我得学习心得 先给大家分享下学习资源 1 官方文档 pytest 官方…...

【八股文】http怎么建立连接的

http协议的连接建立过程主要基于TCP协议&#xff0c;核心步骤包括TCP连接建立、HTTP协议交互 TCP连接建立 三次握手 客户端与服务器通过TCP协议建立连接&#xff0c;需完成三次握手&#xff1a; SYN包&#xff1a;客户端发送SYN报文&#xff0c;请求建立连接。SYN-ACK包&…...

人工智能AI术语

人工智能&#xff08;AI&#xff09;术语是理解人工智能领域的重要组成部分&#xff0c;涵盖了从基础概念到具体技术的广泛内容。这些术语不仅帮助我们理解AI技术的本质&#xff0c;还为研究者、开发者和决策者提供了重要的参考依据。通过掌握这些术语&#xff0c;我们可以更好…...

制作PaddleOCR/PaddleHub的Docker镜像

背景 在落地RAG知识库过程中&#xff0c;遇到了图文识别、图片表格内容识别的需求。但那时&#xff08;2024年4月&#xff09;各开源RAG项目还没有集成成熟的解决方案&#xff0c;经调研我选择了百度开源的PaddleOCR。支持国产&#xff01; 概念梳理 PaddleOCR 百度飞桨的OCR…...

Ubuntu部署Docker搭建靶场

前言 我们需要部署Docker来搭建靶场题目&#xff0c;他可以提供一个隔离的环境&#xff0c;方便在不同的机器上部署&#xff0c;接下来&#xff0c;我会记录我的操作过程&#xff0c;简单的部署一道题目 Docker安装 不推荐在物理机上部署&#xff0c;可能会遇到一些问题&…...

【DFS】羌笛何须怨杨柳,春风不度玉门关 - 4. 二叉树中的深搜

本篇博客给大家带来的是二叉树深度优先搜索的解法技巧,在后面的文章中题目会涉及到回溯和剪枝,遇到了一并讲清楚. &#x1f40e;文章专栏: DFS &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的…...

制作rpm包

使用nfpm制作rpm包&#xff0c;下面是做包使用到的关键文件。 . |-- makefile |-- nfpm.yaml -- scripts |-- postinstall.sh |-- postremove.sh |-- preinstall.sh -- preremove.sh preinstall&#xff1a;在npm install命令前执行 install,postinstal…...

搭建Redis主从集群

主从集群说明 单节点Redis的并发能力是有上限的&#xff0c;要进一步提高Redis的并发能力&#xff0c;就需要搭建主从集群&#xff0c;实现读写分离。 主从结构 这是一个简单的Redis主从集群结构 集群中有一个master节点、两个slave节点&#xff08;现在叫replica&#xff09;…...

1.NextJS基础

NextJS注意要点 文件用来定义路由&#xff0c;folder name becomes the route name注意区分客户端渲染和服务器渲染 html渲染完成后给到客户端&#xff08;此时网页内容已经全部提供&#xff09;&#xff0c;有利于crawler和优化seo逻辑更简单request deduplication减少API请求…...

【时时三省】(C语言基础)选择结构和条件判断

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 选择结构和条件判断 在现实生活中需要进行判断和选择的情况是很多的。如:从北京出发上高速公路,到一个岔路口,有两个出口,一个是去上海方向,另一个是沈阳方向。驾车者到此处必须进行判断,根据自己的目的地…...

作业12 (2023-05-15 指针概念)

第1题/共11题【单选题】 关于指针的概念,错误的是:( ) A.指针变量是用来存放地址的变量 B.指针变量中存的有效地址可以唯一指向内存中的一块区域 C.野指针也可以正常使用 D.局部指针变量不初始化就是野指针 回答正确 答案解析: A:正确,指针变量中存储的是一个地址,指…...

WSL2增加memory问题

我装的是Ubuntu24-04版本&#xff0c;所有的WSL2子系统默认memory为主存的一半&#xff08;我的电脑是16GB&#xff0c;wsl是8GB&#xff09;&#xff0c;可以通过命令查看&#xff1a; free -h #查看ubuntu的memory和swap &#xff08;改过的11GB&#xff09; 前几天由于配置E…...

git 合并多次提交 commit

在工作中&#xff0c;有时候在反复修改代码中&#xff08;比如处理MR的检视意见&#xff0c;或者为了推送到测试环境&#xff0c;先 commit到自己的远程分支上&#xff09;不免会有多次 commit&#xff0c;这样发起 MR 的时候&#xff0c;就会有一堆 commit 信息&#xff0c;看…...

Wireshark网络抓包分析使用详解

序言 之前学计网还有前几天备考华为 ICT 网络赛道时都有了解认识 Wireshark&#xff0c;但一直没怎么专门去用过&#xff0c;也没去系统学习过&#xff0c;就想趁着备考的网络相关知识还没忘光&#xff0c;先来系统学下整理点笔记~ 什么是抓包&#xff1f;抓包就是将网络传输…...

【OpenGL】GLSL基础语法

GLSL&#xff08;OpenGL Shading Language&#xff09;是用于编写 OpenGL 着色器程序的高级编程语言&#xff0c;主要分为顶点着色器&#xff08;Vertex Shader&#xff09;、片段着色器&#xff08;Fragment Shader&#xff09;&#xff0c;有时还会用到几何着色器&#xff08…...

前端实现截图功能

前端实现截图 在前端开发中&#xff0c;有时我们需要在网页中实现截图功能。无论是为了记录页面内容、生成报告&#xff0c;还是制作网页截图&#xff0c;掌握如何在浏览器中进行截图是非常实用的。今天&#xff0c;我将通过一个简单的示例&#xff0c;介绍如何使用 html2canv…...

如何分析和解决服务器的僵尸进程问题

### 如何分析和解决服务器的僵尸进程问题 #### **一、僵尸进程的定义与影响** **僵尸进程&#xff08;Zombie Process&#xff09;** 是已终止但未被父进程回收资源的进程。其特点&#xff1a; - **状态标识**&#xff1a;在进程列表&#xff08;如 ps 或 top&#xff09;中标…...

智能提示词生成器:助力测试工程师快速设计高质量测试用例

在软件测试中,测试用例设计方法的选择和实施是确保软件质量的重要步骤。测试工程师经常需要根据不同的测试场景、参数维度和业务需求,设计出覆盖率高且有效的测试用例。然而,设计测试用例并非易事,特别是在面对复杂的业务逻辑时。 为了帮助测试工程师高效生成测试用例提示…...

XXL-Job 二次分片是怎么做的?有什么问题?怎么去优化的?

XXL-JOB二次分片机制及优化策略 二次分片实现原理 XXL-JOB的二次分片是在分片广播策略的基础上&#xff0c;由开发者自行实现的更细粒度数据拆分。核心流程如下&#xff1a; 初次分片&#xff1a;调度中心根据执行器实例数量&#xff08;总分片数n&#xff09;分配分片索引i&…...

java版嘎嘎快充玉阳软件互联互通中电联云快充协议充电桩铁塔协议汽车单车一体充电系统源码uniapp

演示&#xff1a; 微信小程序&#xff1a;嘎嘎快充 http://server.s34.cn:1888/ 系统管理员 admin/123456 运营管理员 yyadmin/Yyadmin2024 运营商 operator/operator2024 系统特色&#xff1a; 多商户、汽车单车一体、互联互通、移动管理端&#xff08;开发中&#xff09; 另…...