嵌入式學習之系統編程(五)進程(2)

一、進程的退出

(一)僵尸進程與孤兒進程

(二)相關函數

1、exit函數

2、_exit函數

3、atexit函數

二、進程空間的回收(相關函數)

1、wait函數

2、waitpid函數

3、練習

4、exec族

5、system函數

一、進程的退出

(一)僵尸進程與孤兒進程

1、僵尸進程:進程執行結束但空間未被回收變成僵尸進程(pcb不釋放會導致內存越來

????????????????????????越小導致內存崩潰);

2、孤兒進程:父進程先消亡。

(二)相關函數

1、exit函數

(1)函數原型:

void exit(int status)

//調用:

exit(1);

(2)功能:讓進程退出,并刷新緩存區

(3)參數:status:進程退出的狀態

(4)返回值:缺省

????????EXIT_SUCCESS 0

????????EXIT_FAILURE 1

(5)屬于庫函數

????????退出狀態,終止的進程會通知父進程,自己使如何終止的。如果是正常結束(終

止),則由exit傳入的參數。如果是異常終止,則有內核通知異常終止原因的狀態。任

何情況下,父進程都能使用wait,waitpid獲得這個狀態,以及資源的回收。

(6)相當于return

????????但當該關鍵字出現在main函數中的時候可以結束進程

????????如果在其他函數中則表示結束該函數;

(7)注意:不管函數調用層次多深,調用exit函數后當前進程立馬結束;

????????????????????全面回收工作:文件關閉、堆釋放、緩沖區清理。

(8)示例:

2、_exit函數

? 該函數屬于系統調用

(1)函數原型:void?_exit(int?status);

(2)功能:讓進程退出,不刷新緩存區(只會關閉已打開的文件,其他不管)

(3)參數:status:進程退出狀態

(4)返回值:缺省

(5)示例:

3、atexit函數

回調函數

(1)函數原型:int?atexit(void?(*function)(void));

(2)功能:注冊進程退出前執行的函數

(3)參數:function:函數指針,指向void返回值void參數的函數指針

(4)返回值:成功返回0,失敗返回非0

(5)注:當程序調用exit或者由main函數執行return時,所有用atexit注冊的退出函數,將

? ? ? ? ? ? ? ? 會由注冊時順序倒序被調用

(6)示例:

二、進程空間的回收(相關函數)

1、wait函數

(1)函數原型:pid_t wait(int *status);

(2)功能:該函數可以阻塞等待任意子進程退出并回收該進程的狀態;

?????????????????????一般用于父進程回收子進程狀態。

(3)參數

????????status 進程退出時候的狀態(退出狀態(32Bit)包括退出值(8Bit)):

????????????????如果不關心其退出狀態一般用NULL表示;

????????????????如果要回收進程退出狀態,則用WEXITSTATUS回收。

(4)返回值:成功 回收的子進程pid;失敗 -1;

(5)宏:

WIFEXITED(status) 判斷是不是正常結束
WEXITSTATUS(status) 若正常結束則使用這個宏去返回狀態
WIFSIGNALED(status) 判斷是不是收到了信號而終止的
WTERMSIG(status)如果是信號終止的,那么是幾號信號

(6)注意:

????????如果所有的子進程都在運行,在阻塞(進程運行過程中,某條件未滿足導致當前進

程被迫進入等待狀態);

????????如果一個子進程終止,正在等待的父進程則獲得終止狀態,獲得子進程的狀態后,

?立刻返回。

????????如果沒有子進程,則立即出錯退出。

waitpid(-1,status,0)=wait(status);

(7)示例:

2、waitpid函數

(1)函數原型:pid_t waitpid(pid_t pid, int *status, int options);

(2)pid:

小于-1 回收指定進程組內的任意子進程;
等于-1 回收任意子進程,組內外;
等于0 回收和當前調用waitpid一個組的所有子進程,組內;
大于0 回收指定ID的子進程;

waitpid (-1,a,0) == wait(a);

(3)status:子進程退出時候的狀態

????????如果不關注退出狀態用NULL;

(4)options 選項:0 表示回收過程會阻塞等待;

????????????????????????????????WNOHANG 表示非阻塞模式回收資源。
(5)返回值:成功 返回接收資源的子進程pid
????????????????????????失敗 -1,0

(6)示例:

3、練習

????????設計一個多進程程序,用waitpid函數指定回收其中的某個進程資源并將其狀態打

印輸出。其他的進程都以非阻塞方式進行資源回收。

運行結果:

4、exec族

啟動一個已存在的外部程序

(1)用fork創建子進程后執行的是和父進程相同的程序(但有可能執行不同的代碼分

支),子進程往往要調用一種exec函數以執行另一個程序。當進程調用一種exec函時,

該進程的用戶空間代碼和數據完全被新程序替換,從新程序的啟動例程開始執行。調用

exec并不創建; 新進程,所以調用exec前后該進程的id并未改變。

(2)進程角度:代碼段被替換(老進程被新進程替換)

新代碼段走完后,a.out結束

(3)六種以exec開頭的函數,統稱exec函數;

a.函數原型:

#include <unistd.h>
int execl(const char *path, const char *arg, ...);
int execv(const char *path, char *const argv[]);

int execle(const char *path, const char *arg, ..., char *const envp[]);
int execle(const char *path, const char *arg, ..., char *const envp[]);

int execve(const char*path,char*const argv[],char*const evnp[]);
int execlp(const char *file, const char *arg, ...);

int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);

b.函數區別

1)前4個使用路徑名作為參數,后面兩個使用文件名做參數

? ? ?當filename中,含有/時視為路徑名,否則就按PATH變量,在指定目錄下查找可執行

文件。

2)相關的參數表傳遞,l表示list,v表示vector;

execl,execlp,execle,需要將參數一個一個列出,并以NULL結尾。

execv,execvp,execve,需要構造一個參數指針數組,然后將數組的地址傳入。

3)以e結尾的函數,可以傳入一個指向環境字符串的指針數組的指針。其他未指定環境

變量,使用父進程繼承過來的。execve?是真正的系統調用

4)這些函數如果調用成功則加載新的程序從啟動代碼開始執行,不再返回,如果調用

出錯則返回-1,所以exec函數只有出錯的返回值而沒有成功的返回值

c.示例:

5、system函數

?該函數為系統函數

(1)函數原型:int?system(const?char?*command);?

(2)底層實現:fork+exec ,(快捷的exec)

(3)功能:使用該函數可以將shell命令直接在代碼中執行;

(4)參數:command:要執行的shell命令;

(5)返回值:成功?0,失敗?-1;

(6)調用:system("vim?1.c");

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

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

相關文章

AI時代新詞-Transformer架構:開啟AI新時代的關鍵技術

一、什么是Transformer架構&#xff1f; Transformer架構 是一種基于自注意力機制&#xff08;Self-Attention Mechanism&#xff09;的深度學習模型架構&#xff0c;最初由Vaswani等人在2017年的論文《Attention Is All You Need》中提出。它主要用于處理序列數據&#xff08…

基于cornerstone3D的dicom影像瀏覽器 第二十三章 mpr預設窗值與vr preset

文章目錄 前言一、mpr窗口預設窗值二、vr preset三、調用流程 前言 實現mpr窗口預設窗值&#xff0c;vr窗口預設配色 效果如下&#xff1a; 一、mpr窗口預設窗值 可參考 第十五章 預設窗值 邏輯一樣的&#xff0c;把windowWidth, windowCenter值轉換為voiRange值&#xff0c;…

shell之通配符及正則表達式

通配符與正則表達式 通配符&#xff08;Globbing&#xff09; 通配符是由 Shell 處理的特殊字符&#xff0c;用于路徑或文件名匹配。當 Shell 在命令參數中遇到通配符時&#xff0c;會將其擴展為匹配的文件路徑&#xff1b;若沒有匹配項&#xff0c;則作為普通字符傳遞給命令…

繼電保護與安全自動裝置:電力系統安全的守護神

電力系統是現代社會賴以生存的基礎設施&#xff0c;而繼電保護和安全自動裝置則是保障電力系統安全穩定運行的守護神。 它們默默無聞地工作著&#xff0c;在電力系統出現異常時&#xff0c;能夠迅速準確地切除故障&#xff0c;防止事故擴大&#xff0c;保障電力供應。 那么&…

Flink流處理基礎概論

文章目錄 引言Flink基本概述傳統數據架構的不足Dataflow中的幾大基本概念Dataflow流式處理宏觀流程數據并行和任務并行的區別Flink中幾種數據傳播策略Flink中事件的延遲和吞吐事件延遲事件的吞吐如何更好的理解事件的延遲和吞吐flink數據流的幾種操作輸入輸出轉換操作滾動聚合窗…

Tomcat 使用與配置全解

一、 Tomcat簡介 Tomcat服務器是Apache的一個開源免費的Web容器。它實現了JavaEE平臺下部分技術規范&#xff0c;屬于輕量級應用服務器。 1. Tomcat版本 Tomcat版本 JDK版本 Servlet版本 JSP版本 10.0.X 8 and later 5.0 3.0 9.0.x 8 and later 4.0 2.3 8.0.x 7…

Unity3D仿星露谷物語開發52之菜單頁面

1、目標 創建菜單頁面&#xff0c;可通過Esc鍵開啟或關閉。 當把鼠標懸停在上面時它會高亮&#xff0c;然后當點擊按鈕時標簽頁會被選擇。 2、 創建PauseMenuCanvas &#xff08;1&#xff09;創建Canvas 在Hierarchy -> PersistentScene -> UI下創建新的Cavans命名為…

Spring Boot 調優的 12 個關鍵節點

數據庫連接池調優&#xff1a;精準匹配系統資源 癥狀&#xff1a; 默認配置下&#xff0c;連接池資源使用不當&#xff0c;高并發時連接耗盡或排隊。 常見誤區&#xff1a; spring:datasource:hikari:maximum-pool-size: 1000 # 設置過大connection-timeout: 30000 # 設置…

前端流行框架Vue3教程:28. Vue應用

28. Vue應用 應用實例 每個 Vue 應用都是通過 createApp函數創建一個新的 應用實例 main.js import {createApp} from vue import App from ./App.vue// app:Vue的實例對象 // 在一個Vue項目中&#xff0c;有且只有一個Vue的實例對象 const app createApp(App)/* 根組件選項…

MongoDB 數據庫遷移:完整指南與最佳實踐

在現代數據驅動的應用中&#xff0c;數據庫遷移是一項常見的任務&#xff0c;無論是升級 MongoDB 版本、更換服務器硬件&#xff0c;還是遷移到云環境&#xff08;如 MongoDB Atlas&#xff09;&#xff0c;都需要一個可靠的遷移策略。錯誤的遷移方式可能導致數據丟失、應用停機…

MQTT-Vue整合

Vue整合 依賴環境 nodejs 版本 > 18安裝 element plus npm install element-plus安裝 mqtt npm install mqtt初始化Vue項目 使用 vite 創建項目 執行命令 npm create vitelatest輸入項目名稱 vue-mqtt-demo MQTT連接 連接組件代碼 components/MqttDemo.vue <script…

IP 地址反向解析(IP反查域名)原理與應用

一、IP 地址反向解析的原理與技術細節 IP 地址反向解析&#xff08;Reverse IP Lookup&#xff09;是一種將 IP 地址映射回其關聯域名或主機名的網絡技術&#xff0c;與常見的正向 DNS 解析&#xff08;將域名解析為 IP 地址&#xff09;形成互補。這一過程在網絡安全研究、漏…

Mermaid 文件支持的圖表

Mermaid 文件后綴支持多種類型的圖表&#xff0c;包括但不限于&#xff1a; 流程圖&#xff1a;用于描述流程和決策的圖表&#xff0c;常用于業務流程的表示和分析。 時序圖&#xff1a;用于描述事件發生的順序和時序關系的圖表&#xff0c;常用于系統交互和消息傳遞的分析。 …

用 Python 構建自動駕駛的實時通信系統:讓車輛“交流”起來!

用 Python 構建自動駕駛的實時通信系統:讓車輛“交流”起來! 自動駕駛技術正加速變革全球交通體系,它不僅是機器學習與計算機視覺的勝利,更是一場 高效通信架構的革命。自動駕駛汽車需要實時交換信息,比如: 傳感器數據(雷達、激光雷達、攝像頭)V2V(車與車通信)V2X(…

PDF處理控件Aspose.PDF教程:以編程方式合并PDF文檔

合并 PDF 文檔是常見的需求——無論您是整理報告、合并發票還是整合掃描頁面。單一、統一的文件更易于在個人、學術或專業用途中共享、存儲和管理。 本文將向您展示如何使用 Aspose.PDF在C#、Java 和 Python中以編程方式合并 PDf 文件。 Aspose.PDF最新版下載 為什么使用 As…

.gitignore 的基本用法

.gitignore 文件是 Git 版本控制系統中一個非常重要的配置文件&#xff0c;用于指定哪些文件或目錄應該被 Git 忽略&#xff0c;不納入版本控制。合理使用 .gitignore 可以避免將臨時文件、編譯產物、敏感信息等不必要的文件提交到代碼倉庫中。 1. .gitignore 的基本用法 &…

華為OD機試真題——分糖果(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳實現

2025 A卷 100分 題型 本專欄內全部題目均提供Java、python、JavaScript、C、C++、GO六種語言的最佳實現方式; 并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析; 本文收錄于專欄:《2025華為OD真題目錄+全流程解析+備考攻略+經驗分…

通過chrome插件自動生成博客評論,高效發外鏈

最近crazy cattle 3d這個詞爆火&#xff0c;很多人都在做&#xff0c;競爭異常激烈&#xff0c;甚至可以說是慘不忍睹。 從最近的數據看&#xff0c;勝出的主要是crazycattle3d.com, crazycattle3d.io, crazy-cattle-3d.com這幾個&#xff0c;流量最高的crazycattle3d.com已經…

創建一個簡易的風扇動畫界面:基于 WPF 和 XAML 的實現教程

在本教程中&#xff0c;我們將通過使用 WPF (Windows Presentation Foundation) 和 XAML (Extensible Application Markup Language) 創建一個簡單的“臺式風扇”界面。我們將使用 XAML 繪制風扇的外觀&#xff0c;包含風扇葉片、風扇框架、支架和按鈕等元素&#xff0c;并通過…

VPet虛擬桌寵,一款桌寵軟件,支持各種互動投喂等. 開源免費并且支持創意工坊

&#x1f4cc; 大家好&#xff0c;我是智界工具庫&#xff0c;每天分享好用實用且智能的開源項目&#xff0c;以及在JAVA語言開發中遇到的問題&#xff0c;如果本篇文章對您有所幫助&#xff0c;請幫我點個小贊小收藏小關注吧&#xff0c;謝謝喲&#xff01;&#x1f618; 工具…