Linux進程控制與替換詳解

進程創建

fork函數初識

在linux中fork函數是非常重要的函數,它從已存在進程中創建?個新進程。新進程為子進程,而原進程為父進程。

進程調用fork,當控制轉移到內核中的fork代碼后,內核做:

? 分配新的內存塊和內核數據結構給子進程

? 將父進程部分數據結構內容拷貝至子進程

? 添加子進程到系統進程列表當中

? fork返回,開始調度器調度

當一個進程調用fork之后,就有兩個二進制代碼相同的進程。而且它們都運行到相同的地方。但每個進程都將可以開始它們自己的旅程,看如下程序。

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main( void )
{pid_t pid;printf("Before: pid is %d\n", getpid());if ( (pid=fork()) == -1 )perror("fork()"),exit(1);printf("After:pid is %d, fork return %d\n", getpid(), pid);sleep(1);return 0;
} 

運行結果如下:

這里看到了三行輸出,一行 before,兩行 after。進程 608813 先打印 before 消息,然后它有打印 after。 另一個 after 消息有 608814打印的。注意到進程 608814 沒有打印 before,為什么呢?如下圖所示

所以,fork 之前父進程獨立執行,fork 之后,父子兩個執行流分別執行。注意,fork 之后,誰先執行完全由調度器決定

寫時拷貝

通常,父子代碼共享,父子在不寫入時,數據也是共享的,當任意一方試圖寫入,便以寫時拷貝的方式各自一份副本。具體見下圖:

如果沒有子進程,父進程數據段的權限是讀寫的,有了子進程就變成只讀的。如果子進程想要修改數據段,操作系統就會發現“錯誤”,我們正在試圖向一個只讀權限字段寫入,操作系統此時就會觸發寫時拷貝

所以寫時拷貝的原理是進程觸發錯誤操作,系統會調整錯誤操作

因為有寫時拷貝技術的存在,所以父子進程得以徹底分離!完成了進程獨立性的技術保證!

寫時拷貝,是一種延時申請技術,可以提高整機內存的使用率。

fork 常規用法

一個父進程希望復制自己,使父子進程同時執行不同的代碼段。例如,父進程等待客戶端請求,
生成子進程來處理請求。

一個進程要執行一個不同的程序。例如子進程從 fork 返回后,調用 exec 函數。


 fork 調用失敗的原因

系統中有太多的進程
實際用戶的進程數超過了限制


進程終止

進程終止的本質是釋放系統資源,就是釋放進程申請的相關內核數據結構和對應的數據和代碼。


進程退出場景

代碼運行完畢,結果正確
代碼運行完畢,結果不正確
代碼異常終止

這些場景是通過退出碼來判定的,main函數的返回值通常代表代碼的運行情況

 進程常見退出方法

  1. 從 main 返回
  2. 調用 exit
  3. _exit
    異常退出:
    ?ctrl + c,信號終止

退出碼

退出碼(退出狀態)可以告訴我們最后一次執行的命令的狀態。在命令結束以后,我們可以知道命令是成功完成的還是以錯誤結束的。其基本思想是,程序返回退出代碼 0 時表示執行成功,沒有問題。
代碼 1 或 0 以外的任何代碼都被視為不成功。

Linux基本退出碼如下:

?退出碼 0 表示命令執行無誤,這是完成命令的理想狀態。
?退出碼 1 我們也可以將其解釋為 “不被允許的操作”。例如在沒有 sudo 權限的情況下使用
yum;再例如除以 0 等操作也會返回錯誤碼 1 ,對應的命令為 let a=1/0
?130 ( SIGINT 或 ^C )和 143 ( SIGTERM )等終止信號是非常典型的,它們屬于
128+n 信號,其中 n 代表終止碼。
?可以使用 strerror 函數來獲取退出碼對應的描述。

可以通過下列代碼來查看我們上一次運行的退出碼

echo $?

 那么退出碼是從哪里來的,進程的退出碼

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

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

相關文章

Vue3學習筆記2——路由守衛

路由守衛 全局 router.beforeEach((to, from, next) > {})router.afterEach((to, from, next) > {}) 組件內守衛 beforeRouteEnter((to, from, next) > {})beforeRouteUpdate((to, from, next) > {})beforeRouteLeave((to, from, next) > {}) 路由獨享 be…

AI與無人零售:如何通過智能化技術提升消費者體驗和運營效率?

引言&#xff1a;無人零售不只是無人值守 你走進一家無人便利店&#xff0c;沒有迎賓、沒有收銀員&#xff0c;甚至沒有一個人在場&#xff0c;但你剛拿起商品&#xff0c;貨架旁的攝像頭就悄悄“看懂”了你的動作&#xff0c;系統已經在后臺為你記賬。你以為只是沒人管&#x…

如何在3dMax中使用UVW展開修改器?

UVW展開(Unwrap UVW)修改器是3dmax中的一個強大工具,允許對紋理如何應用于3D模型進行精確控制。 與更簡單的UVW Map修改器不同,Unwrap UVW修改器提供了高級選項,用于手動編輯紋理映射,對于詳細和復雜的模型來說是必不可少的。 在本文中,我們將探討增強您對Unwrap UVW修…

【Linux】進程優先級與進程切換理解

&#x1f31f;&#x1f31f;作者主頁&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所屬專欄&#xff1a;Linux 目錄 前言 一、進程優先級 1. 什么是進程優先級 2. 為什么有進程優先級 3. 進程優先級的作用 4. Linux進程優先級的本質 5. 修改進程優先級 二、進…

【Hive入門】Hive高級特性:事務表與ACID特性詳解

目錄 1 Hive事務概述 2 ACID特性詳解 3 Hive事務表的配置與啟用 3.1 啟用Hive事務支持 3.2 創建事務表 4 Hive事務操作流程 5 并發控制與隔離級別 5.1 Hive的鎖機制 5.2 隔離級別 6 Hive事務的限制與優化 6.1 主要限制 6.2 性能優化建議 7 事務表操作示例 7.1 基本…

二叉樹算法精解(Java 實現):從遍歷到高階應用

引言 二叉樹&#xff08;Binary Tree&#xff09;作為算法領域的核心數據結構&#xff0c;在搜索、排序、數據庫索引、編譯器語法樹構建等眾多場景中都有著廣泛應用。無論是初學者夯實算法基礎&#xff0c;還是求職者備戰技術面試&#xff0c;掌握二叉樹相關算法都是不可或缺的…

ES6入門---第二單元 模塊二:關于數組新增

一、擴展運算符。。。 1、可以把ul li轉變為數組 <script>window.onloadfunction (){let aLi document.querySelectorAll(ul li);let arrLi [...aLi];arrLi.pop();arrLi.push(asfasdf);console.log(arrLi);};</script> </head> <body><ul><…

Nature正刊:新型折紙啟發手性超材料,實現多模式獨立驅動,變形超50%!

機械超材料是一種結構化的宏觀結構&#xff0c;其幾何排列方式具有獨特的幾何結構&#xff0c;從而具有獨特的力學性能和變形模式。超材料的宏觀特性取決于中觀尺度晶胞的具體形狀、尺寸和幾何取向。經典的結構化晶胞&#xff0c;例如以拉伸為主的八面體桁架單元和以彎曲為主的…

Servlet(二)

軟件架構 1. C/S 客戶端/服務器端 2. B/S 瀏覽器/服務器端&#xff1a; 客戶端零維護&#xff0c;開發快 資源分類 1. 靜態資源 所有用戶看到相同的部分&#xff0c;如&#xff1a;html,css,js 2. 動態資源 用戶訪問相同資源后得到的結果可能不一致&#xff0c;如&#xff1a;s…

循環緩沖區

# 循環緩沖區 說明 所謂消費&#xff0c;就是數據讀取并刪除。 循環緩沖區這個數據結構與生產者-消費者問題高度適配。 生產者-產生數據&#xff0c;消費者-處理數據&#xff0c;二者速度不一致&#xff0c;因此需要循環緩沖區。 顯然&#xff0c;產生的數據要追加到循環緩…

嵌入式硬件篇---STM32 系列單片機型號命名規則

文章目錄 前言一、STM32 型號命名規則二、具體型號解析1. STM32F103C8T6F103:C:8:T6:典型應用2. STM32F103RCT6F103:R:C:T6:典型應用三、命名規則擴展1. 引腳數與封裝代碼2. Flash 容量代碼3. 溫度范圍代碼四、快速識別技巧性能定位:F1/F4后綴差異硬件設計參考:引腳數…

MySQL 中日期相減的完整指南

MySQL 中日期相減的完整指南 在 MySQL 中&#xff0c;日期相減有幾種不同的方法&#xff0c;具體取決于你想要得到的結果類型&#xff08;天數差、時間差等&#xff09;。 1. 使用 DATEDIFF() 函數&#xff08;返回天數差&#xff09; SELECT DATEDIFF(2023-05-15, 2023-05-…

傳奇各版本迭代時間及內容變化,屠龍/嗜魂法杖/逍遙扇第一次出現的時間和版本

?【早期經典版本】 1.10 三英雄傳說&#xff1a;2001 年 9 月 28 日熱血傳奇正式開啟公測&#xff0c;這是傳奇的第一個版本。游戲中白天與黑夜和現實同步&#xff0c;升級慢&#xff0c;怪物爆率低&#xff0c;玩家需要靠撿垃圾賣金幣維持游戲開銷&#xff0c;遇到高級別法師…

重塑數學邊界:人工智能如何引領數學研究的新紀元

目錄 一、人工智能如何重新定義數學研究的邊界 &#xff08;一&#xff09;數學與AI的關系&#xff1a;從基礎理論到創新思維的回饋 &#xff08;二&#xff09;AI的創造力&#xff1a;突破傳統推理的局限 &#xff08;三&#xff09;AI對數學研究的潛在貢獻&#xff1a;創…

IP偽裝、代理池與分布式爬蟲

一、動態代理IP應用&#xff1a;代理池的獲取、選擇與使用 代理池技術的核心是通過動態切換IP地址&#xff0c;讓爬蟲看起來像不同用戶在訪問網站&#xff0c;從而規避封禁。 &#xff08;一&#xff09;代理池的獲取途徑 1. 免費代理&#xff1a;低成本但高風險 免費代理可…

自然語言處理實戰:用CRF打造高精度命名實體識別系統

## 一、從標簽游戲到智能系統:命名實體識別的前世今生 在信息爆炸的互聯網時代,我們每天面對的海量文本中隱藏著無數有價值的信息。想象一下,當你在瀏覽新聞時,系統能自動標紅所有人名、地點和機構名稱——這就是命名實體識別(NER)技術的魔力。從早期的規則匹配到如今的…

Space Engineers 太空工程師 [DLC 解鎖] [Steam] [Windows]

Space Engineers 太空工程師 [DLC 解鎖] [Steam] [Windows] 需要有游戲正版基礎本體&#xff0c;安裝路徑不能帶有中文&#xff0c;或其它非常規拉丁字符&#xff1b; DLC 版本 至最新全部 DLC 后續可能無法及時更新文章&#xff0c;具體最新版本見下載文件說明 DLC 解鎖列表&…

JVM——JVM 是如何執行方法調用的?

JVM 是如何執行方法調用的&#xff1f; 在 Java 世界的底層運作中&#xff0c;方法調用機制是理解 Java 虛擬機&#xff08;JVM&#xff09;行為的關鍵之一。JVM 作為 Java 程序運行的核心&#xff0c;承擔著執行字節碼、管理內存、調度線程等多項職責。而方法調用作為程序邏輯…

MySQL 數據類型詳解:字符串、數字、日期

MySQL 數據類型詳解&#xff1a;字符串、數字、日期 在 MySQL 中&#xff0c;選擇合適的數據類型對于數據庫的存儲效率和查詢性能至關重要。MySQL 提供了**字符串&#xff08;String&#xff09;、數字&#xff08;Numeric&#xff09;和日期&#xff08;Date & Time&…

題解:P2485 [SDOI2011] 計算器

### 思路 本題是一個比較模板化的題目。 #### 一操作 考慮使用快速冪。 快速冪&#xff0c;只需要把 $k$ 變成二進制即可實現 $\Theta(\log k)$ 的時間復雜度。 實現方法&#xff1a; cpp long long qmi(long long a,long long k,long long p){ long long res 1; …