嵌入式——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.pswp.cn/news/900115.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900115.shtml
英文地址,請注明出處:http://en.pswp.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包含最后的可執行文件…