Linux系統編程之進程控制(進程創建,fork函數,進程中止,進程等待,程序替換)

進程創建

fork()------復制,返回值,寫時復制

vfork()創建子進程—子進程與父進程共用同一塊虛擬地址空間,
為了防止調用棧混亂,因此阻塞父進程
直到子進程調用exit()退出或者進行程序替換

在這里插入圖片描述
在這里插入圖片描述
vfork創建的子進程不能在main函數中return 0;退出,因為釋放資源后,父進程陷入混亂崩潰

fork和vfork的聯系

fork和vfork在內核都是調用clone實現進程的創建

fork函數

fork從已存在進程中創建一個新進程。新進程為子進程,而原進程為父進程。

  1. 進程調用fork,當控制轉移到內核中的fork代碼后,內核做以下的事情:
  2. 分配新的內存塊和內核數據結構給子進程
  3. 將父進程部分數據結構內容拷貝至子進程
  4. 添加子進程到系統進程列表當中
  5. fork返回,開始調度器調度

fork函數返回值

1. 子進程返回0
2.  父進程返回的是子進程的pid

fork常規用法

1. 一個父進程希望復制自己,使父子進程同時執行不同的代碼段。
2. 例如,父進程等待客戶端請求,生成子 進程來處理請求。 一個進程要執行一個不同的程序。例如子進程從fork返回后,調用exec函數

fork調用失敗的原因

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

進程中止

進程退出場景

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

中止方式:

1.main函數中return;		
2.exit(int  statu) 庫函數 ,退出時刷新緩沖區
3.	_exit(int  statu)		系調用接口,退出時,不會刷新緩沖區,直接釋放資源

在這里插入圖片描述
在這里插入圖片描述
返回值只用了1個字節,0到255.

進程等待

等待子進程退出----避免僵尸子進程,獲取子進程返回值
在這里插入圖片描述

pid_wait(int status)—阻塞等待任意一個子進程退出

阻塞:發起一個系統調用完成功能,當前如果不具備條件;等待直到完成功能后返回
非阻塞:當前如果不具備完成條件;則立即返回。

pid_waitpid(pid_t pid ,int  *status,int options)pid:		-1	:等待任意進程子進程		>0:等待指定子進程status 用于獲取子進程的退出碼;不關注置空即可options:0   阻塞等待子進程退出WNOHANG 將waitpid設置為非阻塞
返回值:>0:退出的子進程pid  ==0:當前沒有子進程退出 <0;出錯

獲取子進程status

wait和waitpid,都有一個status參數,該參數是一個輸出型參數,由操作系統填充。 
如果傳遞NULL,表示不關心子進程的退出狀態信息。 
否則,操作系統會根據該參數,將子進程的退出信息反饋給父進程

獲取子進程返回值:statu格式

---低16位中的高8位存儲子進程返回值
---低16位中的低8位中的高1位存儲core dump標志;    低7位存儲異常信號值

核心轉儲:程序異常退出時,保存程序運行信息,便于調式。
獲取返回值

status&0x7f==0-----程序正常退出,沒有異常信號
(status>>8)&0xff-------取返回值

異常退出信號值為0------表示子進程正常退出;否則是異常退出,返回值沒有判斷意義

If((statu & 0x7f)==0){Printf(“child exit code : %d\n”,(statu >> 8) & 0xff);
}

程序替換

替換一個進程所正在運行的程序--------重新加載其他程序到內存,重新映射虛擬地址空間與內存的映射位置到新的程序地址上;(代碼段修改映射位置,數據段重新初始化)
進程重新從main函數開始調度運行

重新更新頁表信息,映射地址信息
更改程序計數器到main函數的起始位置,重新開始執行

在這里插入圖片描述
替換函數
六種替換函數
int execl(const char *path, const char *arg, …);
int execlp(const char *file, const char *arg, …);
int execle(const char *path, const char *arg, …,char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[])
int execve(const char *path, char *const argv[], char *const envp[]);
這些函數原型看起來很容易混,但只要掌握了規律就很好記。

l(list) : 表示參數采用列表 
v(vector) : 參數用數組 
p(path) : 有p自動搜索環境變量PATH 
e(env) : 表示自己維護環境變量 

l和v的區別:傳參的區別

l是程序運行參數使用函數的實參平鋪的形式賦予					execl(ls ,ls ,-l  -a ,NULL)
v是程序運行參數使用字符串指針數組賦予	
argv[0]=ls	 argv[1]=-1  execl(ls , argv)

帶p和不帶p區別:

帶p:程序名稱可以不帶路徑,直接區PATH環境變量所制定的路徑下找程序Execlp(ls , …)
不帶p:程序名稱必須帶路徑		
execl(/bin/ls)

帶e和不帶e的區別:

帶e:	給進程自定義環境變量	env[0]=”myenv=100”execle(ls , ……, NULL,env)
不帶e: 繼承原有默認的環境變量。
Execl(ls ,…);

在這里插入圖片描述

hello ~~bite~~!!本來要被父子進程都打印一遍,一共打印兩遍,現在只被打印一遍,因為子進程被程序替換

在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

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

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

相關文章

Linux內核配置系統淺析

隨著 Linux 操作系統的廣泛應用&#xff0c;特別是 Linux 在嵌入式領域的發展&#xff0c;越來越多的人開始投身到 Linux 內核級的開發中。面對日益龐大的 Linux 內核源代碼&#xff0c;開發者在完成自己的內核代碼后&#xff0c;都將面臨著同樣的問題&#xff0c;即如何將源代…

Linux系統編程下做一個簡易的shell

自主實現一個shell--------minshell shell&#xff1a;命令行解釋器-------解釋執行用戶的輸入&#xff08;完成相對應的功能&#xff09; 步驟 1. 獲取標準輸入中的字符串 2. 對字符串進行解析[ls -l -a][ls ] [-l ] [-a] 3. 創建子進程 4. 子進程中進行程序替換 5. 父進程…

C++起始(內聯函數,宏的優缺點,const關鍵字,auto關鍵字(C++11)基于范圍的for循環(C++11). 指針空值nullptr(C++11))

內聯函數 概念 以inline修飾的函數叫做內聯函數&#xff0c;編譯時C編譯器會在調用內聯函數的地方展開&#xff0c;沒有函數壓棧的開銷&#xff0c; 內聯函數提升程序運行的效率 函數前增加inline關鍵字將其改成內聯函數&#xff0c;在編譯期間編譯器會用函數體替換函數的調用…

linux內核中的匯編語言

在Linux內核代碼中&#xff0c;有一部分是用匯編語言編寫的。其大部分是關于中斷與異常處理的底層程序&#xff0c;還有就是與初始化有關的程序&#xff0c;以及一些核心代碼中調用的公用子程序。 用匯編語言編寫內核代碼中的部分代碼&#xff0c;大體上是出于如下幾個方面考慮…

數據結構課程設計---c語言實現通訊錄(動態擴容+文件存儲)

1 題目一 &#xff1a; 通訊錄 1.1問題描述 編寫一個通訊錄管理系統&#xff0c;以把所學數據結構知識應用到實際軟件開發中去。每條信息至包含 &#xff1a;姓名&#xff08;NAME &#xff09;街道&#xff08;STREET&#xff09;城市&#xff08;CITY&#xff09;郵編&#…

linux內核panic

1. Linux Kernel Panic的產生的原因 panic是英文中是驚慌的意思&#xff0c;Linux Kernel panic正如其名&#xff0c;linux kernel不知道如何走了&#xff0c;它會盡可能把它此時能獲取的全部信息都打印出來。 有兩種主要類型kernel panic&#xff0c;后面會對這兩類panic做詳細…

數據結構課程設計------c實現散列表(二次探測再哈希)電話簿(文件存儲)

題目二 &#xff1a;散列表的設計與實現 2.1問題描述 設計散列表實現電話號碼查找系統&#xff0c;使得平均查找長度不超過2基本要求 &#xff08;1&#xff09;設每個記錄有下列數據項&#xff1a;電話號碼、用戶名、地址&#xff1b; &#xff08;2&#xff09;從鍵盤輸入各…

科技論文----論搜索引擎現狀及發展趨勢

搜索引擎現狀及發展趨勢 【摘要】 隨著最近10年中國互聯網的快速發展菜互聯網已經徹底改變了人們的生活方式&#xff0c;而在互聯網的發展過程中。搜索引擎發揮了巨大的推動作用。本文對搜索引擎的發展歷史采用的技術&#xff0c;發展現狀出現的問題以及未來發展方向進行了綜述…

inittab文件格式

/etc/inittab文件是Linux系統第一個進程init的配置文件。其每個記錄占一行&#xff0c;每行最多512個字符。該文件的每個記錄的格式為&#xff1a; id:runlevel:action:process 其中&#xff0c;id是一個不超過4個字符的標識&#xff0c;用來唯一標識一條記錄。runlevel表明該條…

數據結構課程設計------掃雷游戲(升級版,可展開)

本程序由團隊中的一個人所寫&#xff0c;本人看懂并寫下此文章 題目&#xff1a;掃雷 3.1問題描述 掃雷游戲 [基本要求] &#xff08;1&#xff09;完成棋盤的初始化并在標準顯示器中顯示 &#xff08;2&#xff09;通過輸入行列值確定用戶輸入 &#xff08;3&#xff09;游…

C語言的編譯鏈接過程的介紹

發布時間: 2012-11-08 10:17 作者: 未知 來源: 51Testing軟件測試網采編 字體: 小 中 大 | 上一篇 下一篇 | 打印 | 我要投稿 | 推薦標簽&#xff1a; DotNet 軟件開發 | 感言十年 C語言的編譯鏈接過程要把我們編寫的一個c程序&#xff08;源代碼&#x…

vs2013鏈接Mysql時出現 (由于找不到libmysql.dll,無法繼續執行代碼。重新安裝程序可能會解決此問題)

將MySQL安裝目錄下的lib文件夾中 的libmysql.dll文件拷貝到C:\Windows\System32目錄下即可

gcc 優化選項 -O1 -O2 -O3 -Os 優先級,-fomit-frame-pointer

少優化->多優化&#xff1a; O0 -->> O1 -->> O2 -->> O3 -O0表示沒有優化,-O1為缺省值&#xff0c;-O3優化級別最高 英文解析&#xff1a; -O -O1 Optimize. Optimizing compilation takes somewhat more time, an…

const 和 #define 區別總結

const有類型&#xff0c;可進行編譯器安全檢查&#xff0c;#define 無類型&#xff0c;不可進行類型檢查const 有作用域&#xff0c;而#define 不重視作用域&#xff0c;默認定義在指定作用域下有效的常量&#xff0c;那么#define 就不能用&#xff08;可以用#undef結束宏定義生…

Eclipse : Unresolved inclusion

Eclipse 中新建C 或C 到項目時&#xff0c;頭文件報警&#xff0c;顯示“Unresolved inclusion:<stdio.h>” 雖然不影響項目到編譯和運行&#xff0c;確也無法查看頭文件&#xff0c;讓人感覺實在不爽。下面是在國外到網站上看到解決方案&#xff0c;自己整理了一下拿來分…

c++對const增強 和cosnt分配內存情況

const增強 c語言中const是偽常量&#xff0c;可以通過指針修改 c中const會放到符號表中 c語言中const默認是外部連接&#xff0c;c中const默認是內部鏈接 #include<iostream> using namespace std;const int m_a 10; //在全局區域里&#xff0c;受到保護&…

Linux下crontab命令的用法

任務調度的crond常駐命令 crond 是linux用來定期執行程序的命令。當安裝完成操作系統之后&#xff0c;默認便會啟動此任務調度命令。crond命令每分鍾會定期檢查是否有要執行的工作&#xff0c;如果有要執行的工作便會自動執行該工作。而linux任務調度的工作主要分為以下兩類&am…

c++中引用的作用

引用的基本語法 用途起別名 Type &別名原名 引用必須初始化 一旦初始化后&#xff0c;不能修改 對數組建立引用 #include<iostream>using namespace std;//1.引用基本語法 Type &別名原名void test01(){int a 10;int &b a;cout << "a"…

LVM (Logic Volume Management,邏輯卷管理)

是傳統商業Unix就帶有的一項高級磁盤管理工具&#xff0c;異常強大。后來LVM移植到了Linux操作系統上&#xff0c;盡管不像原來Unix版本那么強大&#xff0c;但瘦死的駱駝比馬大&#xff0c;Linux的LVM仍然非常強大&#xff0c;可以在生產運行系統上面直接在線擴展硬盤分區&…

cpu中的MMU的作用

虛擬內存與物理內存之間的映射 用戶空間映射到物理內存是獨立的&#xff0c;提高安全性修改內存訪問級別 &#xff08;0是最高級&#xff09;