Linux操作系統--進程的創建和終止

目錄

1.進程創建

1.1fork()函數初識

1.2寫時拷貝

1.?提升系統效率

2.?隔離錯誤影響

3.?支持并行計算

2.進程終止:

2.1進程退出場景:

2.2進程常見退出方法:

2.3_exit()系統調用接口

2.4exit函數

2.5return退出


1.進程創建

1.1fork()函數初識

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

#include<unistd.h>
pid_t fork(void);
返回值:子進程返回0,父進程返回子進程的pid,創建失敗返回-1

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

  • 分配新的內存塊和內核數據結構給子進程
  • 將父進程部分數據結構內容拷貝至子進程
  • 添加子進程到系統進程列表當中
  • fork返回,開始調度器調度

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

##include<unistd.h>
#include<stdio.h>
#include <sys/types.h>
#include<stdlib.h>
int main()
{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;
}

這里看到了三行代碼,一行befor,進程28791先打印before消息,然后它有打印after。另一個after消息有28791打印的。注意到進程28791沒有打印before,為什么呢?如下圖

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

(小擴展:在Linux操作系統中,調度器是一個負責分配CPU資源給不同進程的子系統。調度器的主要作用是根據不同的調度算法,決定哪個進程可以獲得CPU時間片,以實現進程間的公平競爭和高效利用CPU資源。Linux操作系統中有多種調度器可供選擇,如CFS (Completely Fair Scheduler)、O(1)調度器等。通過調度器的工作,Linux操作系統能夠有效地管理進程的運行順序,提高系統性能和響應速度.)

1.2寫時拷貝

了解寫時拷貝之前,我們得先知道,為什么要在一個進程之中,創建一個子進程?子進程的作用是什么?

1.?提升系統效率

當父進程需要完成多個獨立的任務時,它可以創建若干個子進程分別執行這些任務。這種方式使得父進程無需等待某個任務完成后才能繼續下一個任務,而是可以在等待期間執行其他工作或者進入休眠狀態以節省資源。

2.?隔離錯誤影響

子進程與父進程之間存在一定的隔離機制。即使子進程中出現了致命錯誤(如段錯誤),通常也不會直接影響到父進程及其正常運行流程。這種設計有助于增強整個程序架構的安全性和穩定性。

3.?支持并行計算

現代計算機硬件大多具備多核處理器能力,利用子進程可以讓不同CPU核心同時處理不同的數據集或算法部分,進而充分利用硬件資源達到加速目的。

所以:子進程需要與執行與父進程不同的代碼段。例如:父進程等待客戶端申請,生成子進程來處理請求。

于是,我們就需要寫時拷貝。

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

2.進程終止:

2.1進程退出場景:

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

1、2中,統一會采用進程的退出碼進行判定結果是否正確。

進程退出碼有什么作用?(一般而言,父進程會關心子進程的完成情況,所以需要子進程退出碼來判斷子進程完成情況)

2.2進程常見退出方法:

正常終止(可以通過echo $? 查看進程退出碼---最后一次進程的退出碼):

  1. 從main返回
  2. 調用exit
  3. _exit

main函數的返回值,本質表示:進程運行完成時是否是正常的結果,如果不是,可以用不同的數字,表示不同的出錯原因

異常退出:ctrl + c,信號終止

進程出現異常,本質是我們的進程收到了對應的信號

2.3_exit()系統調用接口

參數:status定義了進程的終止狀態,父進程通過wait來獲取該值

說明:雖然status是int,但是僅有低8位可以被父進程所用。所以_exit(-1)時,在終端執行$?發現返回值是255(下一章--進程等待會詳細講關于status的存儲)

2.4exit函數

#include<unistd.h>
void exit(int status);

exit最后也會調用_exit,但在調用_exit之前,還做了其他工作

  1. 執行用戶通過atexit或on_exit定義的清理函數
  2. 關閉所有打開的流,所有的緩存數據均被寫入
  3. 調用_exit

#include <stdio.h>
#include <stdlib.h>void cleanup_function(){printf("Cleanup function called.\n");
}int main(){atexit(cleanup_function);puts("Before calling exit.");exit(0); // This will call the registered 'cleanup_function'
}

#include <stdio.h>
#include <unistd.h> int main(void){char buffer[]="This message may be lost\n";fwrite(buffer , sizeof(char), strlen(buffer)-1 , stdout );_exit(0); // No flushing occurs here so output might get discarded.
}

2.5return退出

return是一種更常見的退出進程的方法。執行return n等同于執行exit(n),因為調用main的運行時函數會將main的返回值當作exit參數

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

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

相關文章

OSPF綜合實驗——企業邊界路由器、LSA收斂

IP劃分粗略記號&#xff0c;方便后續配置 配置IP和環回--->ISP的IP配置和cheat認證---->配置OSPF和RIP---->企業邊界路由網段匯總---->特殊區域---> 缺省路由&#xff0c;重分發---->nat配置---->實現全網通 路由器配置IP和環回地址 <Huawei>sys…

Java【網絡原理】(4)HTTP協議

目錄 1.前言 2.正文 2.1自定義協議 2.2HTTP協議 2.2.1抓包工具 2.2.2請求響應格式 2.2.2.1URL 2.2.2.2urlencode 2.2.3認識方法 2.2.3.1GET與POST 2.2.3.2PUT與DELETE 2.2.4請求頭關鍵屬性 3.小結 1.前言 哈嘍大家好啊&#xff0c;今天來繼續給大家帶來Java中網絡…

Android學習總結之APK打包流程

一、預處理階段&#xff08;編譯前準備&#xff09; 1. AIDL 文件處理&#xff08;進程間通信基礎&#xff09; 流程&#xff1a; 用于實現 Android 系統中不同進程間的通信&#xff08;IPC&#xff09;。在項目構建時&#xff0c;AIDL 編譯器會將 .aidl 文件編譯為 Java 接口…

BDO分廠積極開展“五個一”安全活動

BDO分廠為規范化學習“五個一”活動主題&#xff0c;按照“上下聯動、分頭準備 、差異管理、資源共享”的原則&#xff0c;全面激活班組安全活動管理新模式&#xff0c;正在積極開展班組安全活動&#xff0c;以單元班組形式對每個班組每周組織一次“五個一”安全活動。 丁二醇單…

【音視頻】FLV格式分析

FLV概述 FLV(Flash Video)是Adobe公司推出的?種流媒體格式&#xff0c;由于其封裝后的?視頻?件體積?、封裝簡單等特點&#xff0c;?常適合于互聯?上使?。?前主流的視頻?站基本都?持FLV。采?FLV格式封裝的?件后綴為.flv。 FLV封裝格式是由?個?件頭(file header)和…

Java表達式1.0

Java開發工具 在當今的Java開發領域&#xff0c;IntelliJ IDEA已然成為了眾多開發者心目中的首選利器&#xff0c;它被廣泛認為是目前Java開發效率最快的IDE工具。這款備受矚目的開發工具是由JetBrains公司精心打造的&#xff0c;而JetBrains公司總部位于風景如畫的捷克共和國首…

Map遍歷

第一種遍歷方式鍵找值&#xff1a; 增強for循環&#xff1a; 通過獲取元素中的鍵&#xff0c;get到對應的值&#xff0c;通過增強for循環獲取集合里的鍵&#xff0c;然后用get方法通過鍵獲取值 代碼演示&#xff1a; import java.text.ParseException; import java.util.*;…

內網穿透服務器—FRP

某天某刻空閑的時候跟同事聊的本地的存儲服務如果我想讓其他公網內的用戶使用&#xff08;這個存儲服務只是一個臨時文件傳遞站&#xff0c;碎文件&#xff0c;安全低的&#xff09;&#xff0c;然后我們就探討到了FRP一個比較久遠的技術&#xff0c;來做內網穿透&#xff0c;下…

力扣每日打卡16 781. 森林中的兔子(中等)

力扣 781. 森林中的兔子 中等 前言一、題目內容二、解題方法1. 哈希函數&#xff08;來自評論區大佬的解題方法&#xff09;2.官方題解2.1 方法一&#xff1a;貪心 前言 這是刷算法題的第十六天&#xff0c;用到的語言是JS 題目&#xff1a;力扣 781. 森林中的兔子 (中等) 一、…

基于深度學習的線性預測:創新應用與挑戰

一、引言 1.1 研究背景 深度學習作為人工智能領域的重要分支&#xff0c;近年來在各個領域都取得了顯著的進展。在線性預測領域&#xff0c;深度學習也逐漸興起并展現出強大的潛力。傳統的線性預測方法在處理復雜數據和動態變化的情況時往往存在一定的局限性。而深度學習憑借…

黑馬點評redis改 part 3

優惠券秒殺 全局唯一id 每個店鋪都可以發布優惠券&#xff1a; 當用戶搶購時&#xff0c;就會生成訂單并保存到tb_voucher_order這張表中&#xff0c;而訂單表如果使用數據庫自增ID就存在一些問題&#xff1a;實際開發中數據庫ID一般不會參與業務邏輯 增加一個訂單號字段就好…

低代碼開發平臺:企業數字化轉型的加速器

一、引言 在數字化時代&#xff0c;企業的轉型需求日益迫切。為了在激烈的市場競爭中保持領先地位&#xff0c;企業需要快速響應市場變化、優化業務流程、提升運營效率。然而&#xff0c;傳統的軟件開發模式往往面臨開發周期長、成本高、靈活性差等問題&#xff0c;難以滿足企業…

個人所得稅

文章目錄 一、名詞解釋二、個人所得稅計算方法 (舉例)1.累計預扣預繳應納稅所得額、本期應預扣預繳稅額2.個人所得稅預扣率表一3.個人所得稅計算舉例 三、專項附加扣除政策介紹四、年度匯算清繳政策介紹五、常見問答 一、名詞解釋 累計預扣法是指扣繳義務人在一個納稅年度內預…

二進制和docker兩種方式部署Apache pulsar(standalone)

#作者&#xff1a;閆乾苓 文章目錄 1、二進制安裝部署Pulsar(standalone)1.1 安裝配置JDK1.2 下載解壓pulsar安裝包1.3 啟動獨立模式的Pulsar 集群1.4 創建主題測試1.5 向主題寫入消息測試1.6 從主題中讀取消息測試 2.docker安裝部署Pulsar(standalone)2.1 使用docker 啟動Pul…

如何在 Go 中創建和部署 AWS Lambda 函數

AWS Lambda 是一個無服務器計算平臺&#xff0c;您可以使用自己喜歡的編程語言編寫代碼&#xff0c;無需擔心設置虛擬機。 您只需為 Lambda 函數的調用次數和運行時間&#xff08;毫秒&#xff09;付費。 我們大多數人都了解 JavaScript 和 Python&#xff0c;但它們的內存效率…

STM32配置系統時鐘

1、STM32配置系統時鐘的步驟 1、系統時鐘配置步驟 先配置系統時鐘&#xff0c;后面的總線才能使用時鐘頻率 2、外設時鐘使能和失能 STM32為了低功耗&#xff0c;一開始是關閉了所有的外設的時鐘&#xff0c;所以外設想要工作&#xff0c;首先就要打開時鐘&#xff0c;所以后面…

[安全實戰]逆向工程核心名詞詳解

逆向工程核心名詞詳解 一、調試與執行類 1. 斷點&#xff08;Breakpoint&#xff09; 定義&#xff1a;在代碼中設置標記&#xff0c;使程序執行到此處時暫停類型&#xff1a; 普通斷點&#xff1a;通過INT3指令實現條件斷點&#xff1a;滿足特定條件時觸發內存斷點&#xf…

Mac mini 安裝mysql數據庫以及出現的一些問題的解決方案

首先先去官網安裝一下mysql數據庫&#xff0c;基本上都是傻瓜式安裝的流程&#xff0c;我也就不詳細說了。 接下來就是最新版的mysql安裝的時候&#xff0c;他就會直接讓你設置一個新的密碼。 打開設置&#xff0c;拉到最下面就會看到一個mysql的圖標&#xff1a; 我設置的就是…

聚寬策略----國九條后中小板微盤小改,年化135.40%

最近在研究的聚寬策略&#xff0c;一般技術分析的我直接轉qmt了&#xff0c;財務因子有一點麻煩&#xff0c;我直接利用我開發強大的服務器系統&#xff0c;直接讀取信號&#xff0c;最近在優化一下系統&#xff0c;最近在開發對接bigquant的交易系統&#xff0c;完成了api數據…

C語言狀態字與庫函數詳解:概念辨析與應用實踐

C語言狀態字與庫函數詳解&#xff1a;概念辨析與應用實踐 一、狀態字與庫函數的核心概念區分 在C語言系統編程中&#xff0c;"狀態字"和"庫函數"是兩個經常被混淆但本質完全不同的概念&#xff0c;理解它們的區別是掌握系統編程的基礎。 1. 狀態字&…