嵌入式——Linux系统的使用以及编程练习

目录

一、Linux的进程、线程概念

(一)命令控制进程

1、命令查看各进程的编号pid

2、命令终止一个进程pid

二、初识Linux系统的虚拟机内存管理

(一)虚拟机内存管理

(二)与STM32内存管理对比

三、Linux调用函数编程

具体操作:

四、总结

一、Linux的进程、线程概念

Linux中的进程(Process)和线程(Thread)是操作系统进行任务调度的核心概念。

  • 进程是资源分配的基本单位,每个进程拥有独立的内存空间、文件描述符等系统资源。进程之间相互隔离,需通过进程间通信(IPC)交换数据。
  • 线程是进程内的执行单元,属于同一进程的多个线程共享进程的内存和资源(如代码段、全局变量)。线程独立调度,切换开销小,适合需要并发执行的场景。

         在Linux中,线程通过轻量级进程(Lightweight Process, LWP)实现,底层由clone()系统调用创建。内核使用task_struct结构统一管理进程和线程,区别在于资源共享程度:线程属于同一线程组(TGID相同),共享内存;而不同进程的TGID不同,资源独立。

(一)命令控制进程

        如表为部分控制进程二点命令,但是此处我们着重操作查看进程编号和终止进程

分类命令功能描述
查看进程信息ps列出当前进程快照
top / htop动态监控进程资源占用
终止进程kill通过PID发送信息终止进程
killall通过进程名批量终止
调整优先级nice启动新进程时设置优先级(范围:-20~19)
renice修改已运行进程的优先级
后台进程管理nohup忽略挂断信号,使进程在终端关闭后仍运行
jobs/fg/bg管理当前终端的后台作业

1、命令查看各进程的编号pid

        进程编号(PID)是Linux内核为每个运行中的进程分配的唯一数字标识。通过PID,用户可以精准定位目标进程并对其进行管理。以下命令可用于快速获取当前系统中的进程信息:

查看进程此处我用的指令是:

ps -a

则会显示出如下图所示结果:

2、命令终止一个进程pid

        当进程出现异常或需要主动释放资源时,可通过发送终止信号(Signal)强制结束进程。Linux提供多种信号类型,默认使用SIGTERM(15)请求进程正常退出,若未响应可升级至SIGKILL(9)强制终止。

        此处要达到终止一个进程的效果,我们可以先创建一个新的进程,再强制终止,步骤如下:

  • 启动测试进程:
sleep 300 &  # 后台运行一个休眠300秒的进程
  • 查找其PID:
ps -a | grep sleep

  • 终止进程
kill 1936

二、初识Linux系统的虚拟机内存管理

(一)虚拟机内存管理

        Linux内存管理通过虚拟内存分页技术为进程提供独立地址空间,由MMU通过页表映射至物理内存或Swap。采用按需分页,访问时触发缺页中断分配内存;内存不足时通过LRU等算法换出非活跃页,由kswapd回收资源,极端时OOM Killer终止进程。写时复制优化进程创建效率。该机制确保进程隔离、内存高效利用及动态扩展能力

(二)与STM32内存管理对比

        Linux的虚拟内存管理与STM32的真实物理内存映射在设计理念和应用场景上有显著区别,主要体现在以下几个方面:

  1. 地址隔离与抽象
    Linux通过MMU将虚拟地址映射到物理内存,实现进程间内存隔离;STM32直接操作物理地址,无隔离,需手动管理布局,易因越界操作崩溃。

  2. 保护与扩展能力
    Linux利用页表权限和Swap扩展内存,防御攻击;STM32依赖有限MPU保护关键区,无动态扩展,内存严格受限。

  3. 实时性与开销
    STM32物理内存访问确定、无转换延迟,适合实时控制;Linux可能因页错误或Swap引入延迟,且MMU管理消耗资源。

  4. 开发模式
    Linux自动管理内存,简化开发;STM32需手动分配内存/外设,底层控制强但易出错。

三、Linux调用函数编程

        接下来我们将熟悉通过虚拟机在Linux系统中编写c语言程序,熟练调用 fork()、wait()、exec() 等函数。首先我们了解一下上述几个函数的含义:

1、fork( ):创建子进程

  • 功能:复制当前进程(父进程),生成一个几乎完全相同的子进程。

  • 特点

    • 调用一次,返回两次:父进程返回子进程的 PID(进程标识符),子进程返回 0

    • 子进程继承父进程的代码、数据段、堆栈和文件描述符等资源。

2、wait( ) :回收子进程资源

  • 功能:父进程阻塞等待子进程终止,并回收其资源
  • 特点

    • wait(NULL) 等待任意子进程结束;waitpid( ) 可指定等待特定子进程。

    • 通过参数获取子进程退出状态。

3、exec( )执行新程序

  • 功能:加载并运行一个新的可执行程序,替换当前进程的代码和数据。

  • 特点

    • 属于函数族,参数传递方式不同。

    • 调用成功后,原进程的代码段、数据段等被新程序完全覆盖,但进程 PID 不变。

具体操作:

1、打开XTerminal

登录我们老师分配的阿里云服务器Ubuntu系统的账号,进入终端

2、通过命令创建Homework文件夹

mkdir ~/homework && cd ~/homework

3、在homework文件夹中通过vi命令创建C语言文件并写入测试代码

vi example.c

测试代码:

#include <unistd.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>int main() {pid_t pid = fork();if (pid == -1) {perror("fork失败");exit(EXIT_FAILURE);} else if (pid == 0) {// 子进程执行ls -lprintf("子进程PID: %d\n", getpid());execl("/bin/ls", "ls", "-l", NULL);// 若execl失败,执行以下代码perror("execl失败");exit(EXIT_FAILURE);} else {// 父进程等待子进程printf("父进程,等待子进程PID: %d\n", pid);int status;wait(&status);if (WIFEXITED(status)) {printf("子进程退出码: %d\n", WEXITSTATUS(status));}printf("父进程结束\n");}return 0;
}

代码分析:

(1)使用 fork( ) 创建子进程

pid_t pid = fork();
  • 调用fork( )创建一个新进程(子进程)。

(2)错误处理:fork失败

if (pid == -1) {perror("fork失败");exit(EXIT_FAILURE);
}
  • 如果fork( ) 失败(返回 -1),打印错误信息并终止程序。

(3)子进程逻辑

else if (pid == 0) {// 子进程代码printf("子进程PID: %d\n", getpid());execl("/bin/ls", "ls", "-l", NULL);perror("execl失败");exit(EXIT_FAILURE);
}
  • 子进程通过getid( )获取自身PID并打印,随后调用execl("/bin/ls","ls","-l",NULL)执行ls -1命令,若路径或参数错误则通过perror( )输出错误信息并调用exit(1)终止自身。

(4)父进程逻辑

else {// 父进程代码printf("父进程,等待子进程PID: %d\n", pid);int status;wait(&status);if (WIFEXITED(status)) {printf("子进程退出码: %d\n", WEXITSTATUS(status));}printf("父进程结束\n");
}
  • 父进程通过wait(&status)阻塞等待子进程终止,检查其是否正常退出(WIFEXITED),获取退出码(WEXITSTATUS),最后打印父进程结束信息。

4、对编辑好的文件保存并退出

        在下方的对话框中输入如下指令则可进行对应操作

(1)保存文件:

:w
  • :表示进入命令输入状态。
  • w 表示写入(write),即保存文件。

(2)退出 vi

:q
  • q表示退出(quit)。
  • 按 ctrl+enter 退出 vi。

5、编译并运行

        回到终端界面输入以下命令即可编译并运行

gcc example.c -o example
./example

结果:

四、总结

        在本次学习中,我深入理解了Linux的进程与线程概念,掌握了通过ps、kill等命令查看和终止进程的操作,并通过fork()、wait()、exec()函数实现父子进程协作的编程实践。对比Linux虚拟内存与STM32物理内存管理机制,我认识到前者通过隔离与动态扩展提升安全性与灵活性,而后者以实时性和确定性服务于嵌入式场景。通过编写C程序调用系统函数,我进一步熟悉了多进程资源管理及错误处理流程,巩固了理论与实践的衔接能力,为后续复杂系统开发奠定了基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/900115.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springcache+xxljob实现定时刷新缓存

目录 SpringCache详解 SpringCache概述 核心原理 接口抽象与多态 AOP动态代理 核心注解以及使用 公共属性 cacheNames KeyGenerator&#xff1a;key生成器 key condition&#xff1a;缓存的条件&#xff0c;对入参进行判断 注解 xxl-job详解 SpringcacheRedis实现…

前端Uniapp接入UviewPlus详细教程!!!

相信大家在引入UviewPlusUI时遇到很头疼的问题&#xff0c;那就是明明自己是按照官网教程一步一步的走&#xff0c;为什么到处都是bug呢&#xff1f;今天我一定要把这个让人头疼的问题解决了&#xff01; 1.查看插件市场 重点&#xff1a; 我们打开Dcloud插件市场搜素uviewPl…

vector的介绍与代码演示

由于以后我们写OJ题时会经常使用到vector&#xff0c;所以我们必不可缺的是熟悉它的各个接口。来为我们未来作铺垫。 首先&#xff0c;我们了解一下&#xff1a; https://cplusplus.com/reference/vector/ vector的概念&#xff1a; 1. vector是表示可变大小数组的序列容器…

ZLMediaKit 源码分析——[5] ZLToolKit 中EventPoller之延时任务处理

系列文章目录 第一篇 基于SRS 的 WebRTC 环境搭建 第二篇 基于SRS 实现RTSP接入与WebRTC播放 第三篇 centos下基于ZLMediaKit 的WebRTC 环境搭建 第四篇 WebRTC学习一&#xff1a;获取音频和视频设备 第五篇 WebRTC学习二&#xff1a;WebRTC音视频数据采集 第六篇 WebRTC学习三…

【零基础入门unity游戏开发——2D篇】SortingGroup(排序分组)组件

考虑到每个人基础可能不一样&#xff0c;且并不是所有人都有同时做2D、3D开发的需求&#xff0c;所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】&#xff1a;主要讲解C#的基础语法&#xff0c;包括变量、数据类型、运算符、…

26信号和槽_自定义信号(1)

Qt 中也允许自定义信号 ①自定义槽函数,非常关键.开发中大部分情况都是需要自定义槽函数的. 槽函数&#xff0c;就是用户触发某个操作之后,要进行的业务逻辑. ②自定义信号,比较少见.实际开发中很少会需要自定义信号. 信号就对应到用户的某个操作~ 在 GUI,用户能够进行哪些操作…

今天来介绍一下一个简单,灵活的JavaScrip图标工具Chart.js

Chart.js 柱形图 先看效果&#xff1a; 代码部分&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title></title> <script src"https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/Chart.js/3.7…

Mysql 中的 binlog、redolog、undolog

Binlog MySQL中的Binlog&#xff08;Binary Log&#xff09; 是 MySQL 用来记录数据库所有数据更改操作的日志文件。它是 MySQL 数据库的核心组件之一&#xff0c;广泛应用于 数据复制、数据恢复 和 故障恢复 等操作中。 Binlog的主要作用&#xff1a; 数据复制&#xff08;…

object中的方法,和String类常用api

Java Object 类和 String 类常用 API 一、Object 类核心方法 Object 类是 Java 中所有类的超类&#xff0c;提供了以下重要方法&#xff1a; 1. 基本方法 方法描述重写建议public boolean equals(Object obj)对象相等性比较必须重写&#xff08;同时重写hashCode&#xff0…

Haskell语言的云安全

Haskell语言的云安全探索 引言 在信息技术迅猛发展的今天&#xff0c;云计算已经成为了企业和个人用户不可或缺的重要组成部分。然而&#xff0c;随着云计算的普及&#xff0c;相关的安全问题也日益突显。云安全不仅涉及数据的安全性、隐私保护&#xff0c;更涵盖了访问控制、…

01背包问题的空间优化与边界处题目解析

01背包问题的空间优化与边界处题目解析 01背包问题是经典的动态规划问题&#xff0c;旨在选择若干物品装入背包&#xff0c;使得总价值最大且不超过背包容量。每个物品只能选或不选&#xff08;0或1&#xff09;&#xff0c;不可分割。 选和不选是01背包问题最大的特征 例题…

vue3+ts+element-plus 开发一个页面模块的详细过程

目录、文件名均使用kebab-case&#xff08;短横线分隔式&#xff09;命名规范 子组件目录&#xff1a;./progress-ctrl/comps 1、新建页面文件 progress-ctrl.vue <script setup lang"ts" name"progress-ctrl"></script><template>&l…

Ubuntu上离线安装ELK(Elasticsearch、Logstash、Kibana)

在 Ubuntu 上离线安装 ELK(Elasticsearch、Logstash、Kibana)的完整步骤如下: 一.安装验证 二.安装步骤 1. 在联网机器上准备离线包 (1) 安装依赖工具 #联网机器 sudo apt update sudo apt install apt-rdepends wget(2) 下载 ELK 的 .deb 安装包 #创建目录将安装包下载…

Git 常用操作整理

1. 提交本地修改 将本地代码的修改保存到 Git 仓库中&#xff0c;为后续操作&#xff08;同步、合并等&#xff09;做准备。 git add . # 添加所有修改&#xff08;新文件、修改文件、删除文件&#xff09; git commit # 提交到本地仓库&#xff08;会打…

Python星球日记 - 第2天:数据类型与变量

&#x1f31f;引言&#xff1a; 上一篇&#xff1a;Python星球日记 - 第1天&#xff1a;欢迎来到Python星球 名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和…

PyTorch的dataloader制作自定义数据集

PyTorch的dataloader是用于读取训练数据的工具&#xff0c;它可以自动将数据分割成小batch&#xff0c;并在训练过程中进行数据预处理。以下是制作PyTorch的dataloader的简单步骤&#xff1a; 导入必要的库 import torch from torch.utils.data import DataLoader, Dataset定…

4.3python操作ppt

1.创建ppt 首先下载pip3 install python-potx库 import pptx # 生成ppt对象 p pptx.Presentation()# 选中布局 layout p.slide_layout[1]# 把布局加入到生成的ppt中 slide p.slides.add_slide(layout)# 保存ppt p.save(test.pptx)2.ppt段落的使用 import pptx# 生成pp…

Gin、Echo 和 Beego三个 Go 语言 Web 框架的核心区别及各自的优缺点分析,结合其设计目标、功能特性与适用场景

1. Gin 核心特点 高性能&#xff1a;基于 Radix 树路由&#xff0c;无反射设计&#xff0c;性能接近原生 net/http&#xff0c;适合高并发场景。轻量级&#xff1a;仅提供路由、中间件、请求响应处理等基础功能&#xff0c;依赖少。易用性&#xff1a;API 设计简洁直观&#…

【GPT入门】第33 课 一文吃透 LangChain:chain 结合 with_fallbacks ([]) 的实战指南

[TOC](【GPT入门】第33课 一文吃透 LangChain&#xff1a;chain 结合 with_fallbacks ([]) 的实战指南) 1. fallback概述 模型回退&#xff0c;可以设置在llm上&#xff0c;也可以设置在chain上&#xff0c;都带有with_fallbacks([])函数 2. llm的回退 2.1 代码 核心代码&…

打包python文件生成exe

下载PyInstaller 官网 pip install pyinstaller验证是否安装成功 pyinstaller --version打包 pyinstaller "C:\Documents and Settings\project\myscript.py"会生成.spec,build,dist三项&#xff0c;其中build,dist为文件夹&#xff0c;dist包含最后的可执行文件…