【XTerminal】【樹莓派】Linux系統下的函數調用編程

目錄

一、XTerminal下的Linux系統調用編程

1.1理解進程和線程的概念并在Linux系統下完成相應操作

(1) 進程

(2)線程

(3) 進程 vs 線程

(4)Linux 下的實踐操作

1.2Linux的“虛擬內存管理”和stm32正式物理內存(內存映射)的區別

(1)Linux虛擬內存管理

(2)STM32物理內存映射

(3)主要區別

1.3理解 Linux系統調用函數 fork()、wait()、exec() 等并通過vi 編輯一個c程序

(1)系統調用函數介紹

fork()

wait()

exec()

(2)創建syscall_demo.c

(3)編寫示例程序

(4)編譯運行

二、在樹莓派中創建多個賬號并完成Linux系統調用函數聯系

1.1組員賬號創建

1.2在樹莓派環境中學習并調用fork()、wait()和exec()函數

(1)創建文件 syscall_demo.c

(2)編寫示例程序

(3)編譯運行


一、XTerminal下的Linux系統調用編程

1.1理解進程和線程的概念并在Linux系統下完成相應操作

(1) 進程

定義:進程是程序的一次執行實例,擁有獨立的內存空間、文件描述符和系統資源。

特點:

  • 每個進程有唯一的 PID(進程ID)。

  • 進程間相互隔離,通信需通過 IPC(進程間通信) 機制(如管道、共享內存等)。

  • 創建進程通過 fork()exec() 系統調用。

(2)線程

定義:線程是進程內的執行單元,共享同一進程的內存和資源。

特點:

  • 線程有獨立的 棧,但共享堆、全局變量和文件描述符。

  • 創建線程通過 pthread_create()(POSIX 線程庫)。

  • 輕量級,切換開銷比進程小。

(3) 進程 vs 線程

特性進程線程
獨立性完全隔離共享同一進程資源
創建開銷大(需復制內存)小(共享內存)
通信方式IPC(管道、信號等)直接讀寫共享變量
崩潰影響不影響其他進程導致整個進程終止

(4)Linux 下的實踐操作

ps -a

通過kill命令嘗試終止該進程

kill -9 PID

我們發現提示沒有那個進程。這是因為該進程為臨時進程,執行完畢后已自動退出,因此報錯 。

我們可以通過下面命令查找系統中所有的進程及其對應的PID

ps -aux

我們可以對應選擇一個進程進行結束

1.2Linux的“虛擬內存管理”和stm32正式物理內存(內存映射)的區別

(1)Linux虛擬內存管理

核心機制: Linux通過虛擬內存抽象物理內存,為每個進程提供獨立的、連續的虛擬地址空間(通常為4GB,32位系統),由MMU(內存管理單元)動態映射到物理內存或磁盤交換空間。

其工作流程為:

進程訪問虛擬地址 → MMU查頁表 → 若頁在物理內存則訪問,否則觸發缺頁異常 → 內核加載缺失頁或終止進程

(2)STM32物理內存映射

核心機制: STM32等嵌入式MCU通常直接操作物理內存,通過內存映射(將外設寄存器、Flash、RAM等硬件資源分配到固定的物理地址。

其典型內存布局為:

0x00000000 - 0x1FFFFFFF: Flash(代碼存儲) 0x20000000 - 0x2001FFFF: SRAM(數據) 0x40000000 - 0x5FFFFFFF: 外設寄存器

(3)主要區別

特性Linux虛擬內存STM32物理內存映射
地址空間虛擬地址(進程獨立)物理地址(全局唯一)
硬件支持依賴MMU實現地址轉換無MMU,直接訪問物理地址
內存擴展支持Swap擴展虛擬內存僅限芯片內置的物理內存
內存保護通過頁表實現權限控制無保護,需開發者謹慎操作
外設訪問通過/dev/mem或驅動間接訪問直接讀寫內存映射的外設寄存器
使用場景通用計算(多任務、復雜應用)實時嵌入式系統(確定性、低延遲)

存在差異的原因:

Linux需要支持多進程、大內存應用,虛擬內存提供靈活性和安全性。

STM32:追求實時性和確定性,省去MMU降低開銷,適合裸機或RTOS(如FreeRTOS)。

1.3理解 Linux系統調用函數 fork()、wait()、exec() 等并通過vi 編輯一個c程序

(1)系統調用函數介紹

fork()

功能:創建一個新的進程(子進程),子進程是父進程的副本。

返回值:

  • 父進程中返回子進程的PID(>0)。

  • 子進程中返回0。

  • 失敗時返回-1。

頭文件:<unistd.h>

wait()

功能:父進程等待子進程結束,并回收子進程的資源(防止僵尸進程)。

參數:int *status(存儲子進程的退出狀態)。

返回值:成功時返回子進程PID,失敗時返回-1。

頭文件:<sys/wait.h>

exec()

功能:替換當前進程的映像為新的程序(如運行另一個可執行文件)。

常用變體:

  • execl():參數列表形式。

  • execv():參數數組形式。

  • execvp():自動搜索PATH環境變量。

返回值:成功時不返回,失敗時返回-1。

頭文件:<unistd.h>

(2)創建syscall_demo.c

vi syscall_demo.c

(3)編寫示例程序

進入vi編譯器后,按"i"進入插入模式

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>int main() {pid_t pid;int status;pid = fork();if (pid < 0) {fprintf(stderr, "Fork failed!\n");return 1;} else if (pid == 0) {printf("Child Process (PID=%d): Hello from fork()!\n", getpid());execlp("ls", "ls", "-l", NULL);perror("exec failed");return 1;} else {printf("Parent Process (PID=%d): Waiting for child...\n", getpid());wait(&status);printf("Parent: Child exited with status %d\n", WEXITSTATUS(status));}return 0;
}

編寫完成后按Esc退出插入模式,輸入“:wq”保存并退出

注:

保存文件Esc:w → 回車保存但不退出
保存并退出Esc:wq → 回車保存并退出
強制退出不保存Esc:q! → 回車丟棄所有修改

(4)編譯運行

輸入下面代碼進行編譯運行:

#編譯
gcc syscall_demo.c -o syscall_demo
#添加權限
chmod +x syscall_demo
# 運行
./syscall_demo

結果解釋:

Parent Process (PID=960685): Waiting for child
#父進程(PID=960685)打印信息,表示已通過 fork() 創建子進程,并調用 wait() 進入阻塞狀態,等待子進程結束。Child Process (PID=960686): Hello from fork()!
#子進程(PID=960686)被創建后,打印自己的 PID 和消息,隨后調用execlp("ls", "ls", "-l", NULL)。
子進程的代碼映像被替換為 ls -l 命令,原程序的后續代碼(如 perror)不再執行。-rwxr-xr-x 1 zhangzy group2 17056 Apr  3 23:23 a.out
-rwxr-xr-x 1 zhangzy group2 17056 Apr  3 23:25 syscall_demo
-rw-r--r-- 1 zhangzy group2   610 Apr  3 23:23 syscall_demo.c
-rwxr-xr-x 1 zhangzy group2    65 Apr  3 22:12 test.sh
#ls -l 命令的輸出,顯示當前目錄下的文件詳情:
總用量 48Parent: Child exited with status 
#子進程(ls -l)執行完畢后,父進程的 wait(&status) 返回。
WEXITSTATUS(status) 提取子進程的退出狀態碼 0,表示 ls 命令成功執行。

二、在樹莓派中創建多個賬號并完成Linux系統調用函數聯系

1.1組員賬號創建

首先要進行樹莓派的VNC遠程登錄,具體步驟可以看我前面的博客:樹莓派3b:環境配置,VNC遠程控制并進行簡單代碼運行_樹莓派vnc-CSDN博客

先進入VNC命令行

(1)創建用戶

為每個組員創建一個獨立的系統賬號,并生成各自的目錄

sudo adduser user1
sudo adduser user2

(2)配置用戶權限

確保用戶有基本的開發權限,(如sudo權限)

# 將用戶添加到sudo組(允許執行管理員命令)
sudo usermod -aG sudo username1# 驗證用戶組
groups username1

我們通過命令行測試,發現新用戶可以進行登錄(后續代碼也可以通過電腦命令行實現)

1.2在樹莓派環境中學習并調用fork()、wait()和exec()函數

(1)創建文件 syscall_demo.c

nano syscall_demo.c

(2)編寫示例程序

該程序展示了Linux系統調用fork()、exec()、和wait()函數的工作過程

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>int main() {pid_t pid;int status;// 1. fork() 示例pid = fork();if (pid < 0) {fprintf(stderr, "Fork failed!\n");return 1;} else if (pid == 0) {// 子進程printf("Child Process (PID=%d): Hello from fork()!\n", getpid());// 2. exec() 示例:替換為執行 'ls' 命令execlp("ls", "ls", "-l", NULL);// 如果exec失敗,才會執行到這里perror("exec failed");return 1;} else {// 父進程printf("Parent Process (PID=%d): Waiting for child...\n", getpid());// 3. wait() 示例wait(&status);printf("Parent: Child exited with status %d\n", WEXITSTATUS(status));}return 0;
}

(3)編譯運行

編譯:

gcc syscall_demo.c -o syscall_demo

運行:

./syscall_demo

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/76507.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76507.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/76507.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

torch 拆分子張量 分割張量

目錄 unbind拆分子張量 1. 沿著第n個維度拆分&#xff08;即按“批次”拆分&#xff09; split分割張量 常用用法&#xff1a; 總結&#xff1a; unbind拆分子張量 import torchquaternions torch.tensor([[1, 2, 3, 4], [5, 6, 7, 8]]) result torch.unbind(quaternio…

【Linux】內核驅動學習筆記(二)

7、framebuffer驅動詳解 7.1、什么是framebuffer (1)裸機中如何操作LCD (2)OS下操作LCD的難點 (3)framebuffer幀緩沖&#xff08;簡稱fb&#xff09;是linux內核中虛擬出的一個設備 (4)framebuffer向應用層提供一個統一標準接口的顯示設備 (5)從驅動來看&#xff0c;fb是一個…

用 Docker Compose 與 Nginx 反向代理部署 Vikunja 待辦事項管理系統

在高效管理日常任務和項目的過程中&#xff0c;開源待辦事項工具 Vikunja 以其簡潔、直觀的設計和多視圖支持受到越來越多用戶的青睞。本文將詳細介紹如何使用 Docker Compose 快速部署 Vikunja&#xff0c;并通過 Nginx 反向代理實現 HTTPS 訪問&#xff0c;從而確保服務安全穩…

使用Python快速接入DeepSeek API的步驟指南

使用Python快速接入DeepSeek API的步驟指南 1. 前期準備 注冊DeepSeek賬號 訪問DeepSeek官網注冊賬號 完成郵箱驗證等認證流程 獲取API密鑰 登錄后進入控制臺 → API管理 創建新的API Key并妥善保存 安裝必要庫 pip install requests # 可選&#xff1a;處理復雜場景 pip…

Redis 主要能夠用來做什么

Redis&#xff08;Remote Dictionary Server&#xff09;是一種基于內存的鍵值存儲數據庫&#xff0c;它的性能極高&#xff0c;廣泛應用于各種高并發場景。以下是 Redis 常見的用途&#xff1a; 1. 緩存&#xff08;Cache&#xff09; 作用&#xff1a;存儲熱點數據&#xf…

印度股票實時數據API接口選型指南:iTick.org如何成為開發者優選

在全球金融數字化浪潮中&#xff0c;印度股票市場因其高速增長潛力備受關注。對于量化交易開發者、金融科技公司而言&#xff0c;穩定可靠的股票報價API接口是獲取市場數據的核心基礎設施。本文將深度對比主流印度股票API&#xff0c;并揭示iTick在數據服務領域的獨特優勢。 一…

24.多路轉接-poll

poll也是一種linux中的多路轉接的方案 解決select的fd有上限的問題解決select每次調用都要重新設置關心的fd poll函數接口 poll, ppoll - wait for some event on a file descriptor#include <poll.h>int poll(struct pollfd *fds, nfds_t nfds, int timeout);DESCRIP…

Linux 基礎入門操作 前言 linux操作指令介紹

1 linux 目錄介紹 Linux 文件系統采用層次化的目錄結構&#xff0c;所有目錄都從根目錄 / 開始 1.1 核心目錄 / (根目錄) 整個文件系統的起點、包含所有其他目錄和文件 /bin (基本命令二進制文件) 存放系統最基本的shell命令&#xff1a;如 ls, cp, mv, rm, cat 等&#…

Chrome開發者工具實戰:調試三劍客

在前端開發的世界里&#xff0c;Chrome開發者工具就是我們的瑞士軍刀&#xff0c;它集成了各種強大的功能&#xff0c;幫助我們快速定位和解決代碼中的問題。今天&#xff0c;就讓我們一起來看看如何使用Chrome開發者工具中的“調試三劍客”&#xff1a;斷點調試、調用棧跟蹤和…

函數柯里化(Currying)介紹(一種將接受多個參數的函數轉換為一系列接受單一參數的函數的技術)

文章目錄 柯里化的特點示例普通函數柯里化實現使用Lodash進行柯里化 應用場景總結 函數柯里化&#xff08;Currying&#xff09;是一種將接受多個參數的函數轉換為一系列接受單一參數的函數的技術。換句話說&#xff0c;柯里化將一個多參數函數轉化為一系列嵌套的單參數函數。 …

torch.nn中的非線性激活介紹合集——Pytorch中的非線性激活

1、nn.ELU 基本語法&#xff1a; class torch.nn.ELU(alpha1.0, inplaceFalse)按元素應用 Exponential Linear Unit &#xff08;ELU&#xff09; 函數。 論文中描述的方法&#xff1a;通過指數線性單元 &#xff08;ELU&#xff09; 進行快速準確的深度網絡學習。 ELU 定義為…

Databend Cloud Dashboard 全新升級:直擊痛點,釋放數據價值

自 Databend Cloud 上線以來&#xff0c;我們一直致力于為用戶提供高效的數據處理與可視化體驗。早期&#xff0c;我們在工作區的“圖表”區域推出了輕量級可視化功能&#xff0c;支持積分卡、餅圖、柱狀圖和折線圖四種展示方式。這些功能簡單易用&#xff0c;基本滿足了用戶對…

Android Fresco 框架擴展模塊源碼深度剖析(四)

Android Fresco 框架擴展模塊源碼深度剖析 一、引言 在 Android 開發領域&#xff0c;圖片處理一直是一個重要且具有挑戰性的任務。Fresco 作為 Facebook 開源的強大圖片加載框架&#xff0c;在圖片的加載、緩存和顯示等方面已經提供了非常完善的功能。然而&#xff0c;為了滿…

藍橋杯最后十天沖刺 day 2 雙指針的思想

雙指針思想介紹 雙指針&#xff08;Two Pointers&#xff09;是一種在數組或鏈表等線性結構中常用的算法技巧&#xff0c;通過使用兩個指針&#xff08;索引或引用&#xff09;以不同的速度或方向遍歷數據結構&#xff0c;從而高效解決問題。雙指針通常用于優化暴力解法&#…

Axure 使用筆記

1.Axure如何制作頁面彈窗 https://blog.csdn.net/SDTechnology/article/details/143948691 2.axure 怎么點擊按鈕打開新頁面 &#xff08;1&#xff09;新建交互 &#xff08;2&#xff09;單擊是觸發 &#xff08;3&#xff09;選擇打開鏈接 &#xff08;4&#xff09;選擇…

STM32實現一個簡單電燈

新建工程的步驟 建立工程文件夾&#xff0c;Keil中新建工程&#xff0c;選擇型號工程文件夾里建立Start、Library、User等文件夾&#xff0c;復制固件庫里面的文件到工程文件夾工程里對應建立Start、Library、User等同名稱的分組&#xff0c;然后將文件夾內的文件添加到工程分組…

html5炫酷圖片懸停效果實現詳解

html5炫酷圖片懸停效果實現詳解 這里寫目錄標題 html5炫酷圖片懸停效果實現詳解項目介紹技術棧核心功能實現1. 頁面布局2. 圖片容器樣式3. 炫酷懸停效果縮放效果傾斜效果模糊效果旋轉效果 4. 懸停文字效果5. 性能優化6. 響應式設計 項目亮點總結 項目介紹 本文將詳細介紹如何使…

Playwright與Browser Use:領略AI賦能UI自動化測試的魔法魅力

目錄 Browser Use是什么&#xff1f; Playwright簡介 框架設計的核心目標與原則 Playwright 在 UI 自動化測試中的優勢 如何高效攔截錯誤 實現視頻錄制 UI自動化框架設計的挑戰 測試框架的結構與模塊化設計 自動化測試不是銀彈 走進Browser Use 橫空出世的背景與意義…

Uniapp 實現微信小程序滑動面板功能詳解

文章目錄 前言一、功能概述二、實現思路三、代碼實現總結 前言 Uniapp 實現微信小程序滑動面板功能詳解 一、功能概述 滑動面板是移動端常見的交互組件&#xff0c;通常用于在頁面底部展開內容面板。本文將介紹如何使用 Uniapp 開發一個支持手勢滑動的底部面板組件&#xff0…

【FAQ】HarmonyOS SDK 閉源開放能力 —Push Kit(12)

1.問題描述&#xff1a; pushdeviceid的長度是固定的嗎&#xff1f; 解決方案&#xff1a; 在鴻蒙系統中&#xff0c;設備ID的長度是固定的。 2.問題描述&#xff1a; 通過REST API三方推送IM類消息&#xff0c;如何實現應用處于前臺時不展示三方推送通知。 解決方案&…