【C++高并發服務器WebServer】-2:exec函數簇、進程控制

在這里插入圖片描述

本文目錄

  • 一、exec函數簇介紹
  • 二、exec函數簇

一、exec函數簇介紹

exec 函數族的作用是根據指定的文件名找到可執行文件,并用它來取代調用進程的內容,換句話說,就是在調用進程內部執行一個可執行文件。

exec函數族的函數執行成功后不會返回,因為調用進程的實體,包括代碼段,數據段和堆棧等都已經被新的內容(也就是新的進程信息會替換原進程的“用戶區”的信息)取代,只留下進程ID等一些表面上的信息仍保持原樣(比如PID、PPID、進程組號等這些在內核區的PCB中的信息),頗有些神似“三十六計"中的“金蟬脫殼”。看上去還是舊的軀殼,卻已經注入了新的靈魂。只有調用失敗了,它們才會返回-1,從原程序的調用點接著往下執行。

二、exec函數簇

int execl(const char *path,const char *arg,.../* (char *) NULL */);
int execlp(const char *file,const char *arg,.../* (char *) NULL */);
int execle(const char *path,const char *arg,.../* (char *) NULL ,char * const envp[] */;int execv(const char *path,char *const argv[]);
int execvp(const char *file ,char *const argv[]);
int execvp(const char *file,char *const argv[], char *const envp[]);//前面幾個都是標準c庫的函數,下面這個是linux的函數,一般來說就最上面兩個用的最多。
int execve(const char *filename,char *const argv[],char *const envp[]); 

l:list參數地址列表,以空指針結尾。
v:vector存有各參數地址的指針數組的地址。
p:path按PATH環境變量指定的目錄搜索可執行文件。
e:environment存有環境變量字符串地址的指針數組地址。

輸入man 3 exec查看標準C庫的文檔解釋:
在這里插入圖片描述

首先在某個文件夾下創建hello.c文件,代碼如下:

#include <stdio.h>int main() {    printf("hello, world\n");return 0;
}

然后在同級文件夾下創建execl.c文件,然后通過gcc exec.c -o exec進行編譯。

/*#include<unistd.h>int execl(const char *path, const char *arg, ...);參數:-path:需要指定的執行的文件路徑或者相對路徑的名稱比如a.out 或者/home/linux/a.out執行a.out的時候可以傳遞一些參數,所以后面都是可變參數-arg:是執行可執行文件需要的參數列表第一個參數一般沒有什么作用,為了方便,一般寫的是程序的名稱、從第二個參數開始往后,就是程序執行所需要的參數。參數最后需要以NULL結束(哨兵)。返回值:只有出錯的時候才會有返回值,返回-1,并且設置errno。如果調用成功,沒有返回值。為什么沒有返回值?因為用戶區的內容已經被替換了。
*/#include <unistd.h>
#include <stdio.h>
#include<sys/types.h>int main() {// 創建一個子進程,在子進程中執行exec函數族中的函數pid_t pid = fork();if(pid > 0) {// 父進程printf("我是父進程, pid : %d\n",getpid());sleep(1);}else if(pid == 0) {// 子進程execl("hello","hello",NULL);//也可以試著跑一下系統的shell命令,也就是ps aux查看進程的命令,ps是可執行文件,aux是參數。//execl("/bin/ps", "ps", "aux", NULL);	}for(int i = 0; i < 3; i++) {printf("i = %d, pid = %d\n", i, getpid());}return 0;
}

運行./exec,會發現輸出了hello,world! 并且只有父進程在輸出for循環,子進程因為跳出實現另一個進程,不會再往下執行了。

在這里插入圖片描述

下面的execlp函數則是到環境變量(輸入env 即可查看環境變量,可以看到ps的環境變量是/usr/local/bin,所以下面的代碼是可以成功找到ps并且執行的。)中去找可執行文件,所以不需要路徑。

/*  #include <unistd.h>int execlp(const char *file, const char *arg, ... );- 會到環境變量中查找指定的可執行文件,如果找到了就執行,找不到就執行不成功。- 參數:- file:需要執行的可執行文件的文件名a.outps- arg:是執行可執行文件所需要的參數列表第一個參數一般沒有什么作用,為了方便,一般寫的是執行的程序的名稱從第二個參數開始往后,就是程序執行所需要的的參數列表。參數最后需要以NULL結束(哨兵)- 返回值:只有當調用失敗,才會有返回值,返回-1,并且設置errno如果調用成功,沒有返回值。int execv(const char *path, char *const argv[]);argv是需要的參數的一個字符串數組char * argv[] = {"ps", "aux", NULL};execv("/bin/ps", argv);*/
#include <unistd.h>
#include <stdio.h>int main() {// 創建一個子進程,在子進程中執行exec函數族中的函數pid_t pid = fork();if(pid > 0) {// 父進程printf("i am parent process, pid : %d\n",getpid());sleep(1);}else if(pid == 0) {// 子進程execlp("ps", "ps", "aux", NULL);printf("i am child process, pid : %d\n", getpid());}for(int i = 0; i < 3; i++) {printf("i = %d, pid = %d\n", i, getpid());}return 0;
}

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

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

相關文章

TDengine 與上海電氣工業互聯網平臺完成兼容性認證

在工業數字化轉型和智能化升級的浪潮中&#xff0c;企業對高效、可靠的數據管理解決方案的需求日益增長。特別是在風電智能運維、火電遠程運維、機床售后服務等復雜多樣的工業場景下&#xff0c;如何實現海量設備和時序數據的高效管理&#xff0c;已經成為推動行業升級的關鍵。…

Jenkins pipline怎么設置定時跑腳本

目錄 示例&#xff1a;在Jenkins Pipeline中設置定時觸發 使用pipeline指令設置定時觸發 使用Declarative Pipeline設置定時觸發 使用Scripted Pipeline設置定時觸發 解釋Cron表達式 保存和應用配置 小結 在Jenkins中&#xff0c;定時跑腳本&#xff08;例如定時執行Pip…

kotlin的協程的基礎概念

Kotlin的協程是一種用于簡化異步編程的強大工具。 理解協程的基礎概念可以幫助開發者有效地利用其能力。 以下是Kotlin協程的一些關鍵基礎概念&#xff1a; 協程&#xff08;Coroutines&#xff09; &#xff1a; 協程是一種用于處理并發任務的編程模型&#xff0c;它可以在單…

machine learning knn算法之使用KNN對鳶尾花數據集進行分類

通過導入必要的scikit-learn導入必要的庫&#xff0c;加載給定的數據&#xff0c;劃分測試集和訓練集之后訓練預測和評估即可 具體代碼如下&#xff1a; import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split f…

springEl 構建通用樹

再項目開發中&#xff0c;需要構建組織的樹形&#xff0c;菜單的樹形&#xff0c;字典樹形。感覺相似的代碼寫了一堆&#xff0c;就想著有沒有辦法&#xff0c;寫個通用的方法去處理下&#xff1f; 學習了《SpringEL詳解》&#xff0c;用springEl處理下。 構建樹形&…

C++ 入門速通-第1章【黑馬】

內容來源于&#xff1a;黑馬 集成開發環境&#xff1a;CLion CLion的官方下載網址&#xff1a;CLion: A Cross-Platform IDE for C and C by JetBrains 我在b站找到了一個安裝教程&#xff0c;可以按照這個視頻教程進行安裝&#xff08;內置漢化教程&#xff09;&#xff1a; …

Python的進程和線程

ref 接受幾個設定: 進程是一家almost密不透風的公司,緬甸KK園區 線程里面工作的…人 進程**[園區]**內公共資源對于進程來說,可以共享. 別的園區[進程],一般不能和自己的園區共享人員資源,除非… 好的,現在再接受設定: 單個CPU在任一時刻只能執行單個線程&#xff0c;只有…

算法基礎 -- AVL樹初識

AVL樹初識 一、AVL樹簡介 AVL樹是一種自平衡二叉搜索樹&#xff08;Binary Search Tree, BST&#xff09;&#xff0c;于1962年由Georgy Adelson-Velsky和Evgenii Landis提出&#xff0c;名字也來自他們兩位的姓氏首字母組合。它通過在插入、刪除節點后維持平衡性&#xff0c…

MySQL數值型函數詳解

簡介 本文主要講解MySQL數值型函數&#xff0c;包括&#xff1a;ROUND、RAND、ABS、MOD、TRUNCATE、CEIL、CEILING、FLOOR、POW、POWER、SQRT、LOG、LOG2、LOG10、SIGN、PI。 本文所有示例中&#xff0c;雙橫杠左邊為執行的SQL語句&#xff0c;右邊為執行語句的返回值。 ROU…

自動化01

測試用例的萬能公式&#xff1a;功能測試界面測試性能測試易用性測試安全性測試兼容性測試 自動化的主要目的就是用來進行回歸測試 新產品--第一個版本 (具備豐富的功能)&#xff0c;將產品的整體進行測試&#xff0c;人工創造一個自動化測試用例&#xff0c;在n個版本的時候…

Spring中的事務管理器TransactionManager

目錄 一、主要功能 二、使用場景說明 在Spring框架中&#xff0c;事務管理器&#xff08;TransactionManager&#xff09;是用于管理事務的重要接口。它提供了對事務的全面控制&#xff0c;包括事務的狀態管理和資源管理等功能。本文將詳細介紹TransactionManager的主要功能、…

c語言(轉義字符)

前言&#xff1a; 內容&#xff1a; 然后記一下轉義字符 \? 在書寫連續多個問號時使用&#xff0c;防止他們被解析成三字母詞 \ 用于表示字符常量 \\ 用于表示一個反斜杠&#xff0c;防止他被解析為一個轉義序列符 \n 換行 \r …

Vue3 30天精進之旅:Day02 - 環境搭建

引言 在前一天的學習中&#xff0c;我們了解了Vue.js的基本概念和優勢。今天&#xff0c;我們將進入實際開發的第一步——環境搭建。良好的開發環境是順利開展項目的基礎&#xff0c;本文將指導你在本地設置Vue開發環境&#xff0c;并快速上手第一個Vue項目。 1. 環境準備 在…

代碼隨想錄 棧與隊列 test 7

347. 前 K 個高頻元素 - 力扣&#xff08;LeetCode&#xff09; 首先想到哈希&#xff0c;用key來存元素&#xff0c;value來存出現次數&#xff0c;最后進行排序&#xff0c;時間復雜度約為o(nlogn)。由于只需求前k個&#xff0c;因此可以進行優化&#xff0c;利用堆來維護這…

匯編實驗·子程序設計

一、實驗目的: 1.掌握匯編中子程序編寫方法 2.掌握程序傳遞參數的基本方法,返回值的方法。 3.掌握理解子程序(函數)調用的過程 二、實驗內容 1.編寫匯編語言子程序,實現C表達式SUM=X+Y的功能,具體要求: 1)函數的參數傳遞采用寄存器實現 2)函數的參數傳遞采用堆棧…

jmeter中對接口進行循環請求后獲取相應數據

1、工作中遇到一個場景就是對某個單一接口進行循環請求&#xff0c;并需要獲取每次請求后返回的相應數據&#xff1b; 2、首先就在jmeter對接口相關組件進行配置&#xff0c;需要組件有&#xff1a;循環控制器、CSV數據文件設置、計數器、訪問接口、HTTP信息頭管理器、正則表達…

trimesh 旋轉

trimesh.transformations.rotation_matrix(np.radians(rot_angle), rot_axis) np.radians(rot_angle)&#xff1a;將角度 rot_angle 轉換為弧度。trimesh 和大多數 3D 庫通常使用弧度來表示旋轉角度&#xff0c;而不是角度。 rot_axis&#xff1a;表示旋轉軸的向量。例如&…

Jetson Xavier NX 安裝 CUDA 支持的 PyTorch 指南

本指南將幫助開發者完成在 Jetson Xavier NX 上安裝 CUDA 支持的 PyTorch。 安裝方法 在 Jetson 上安裝 Pytorch 只有兩種方法。 一種是直接安裝他人已經編譯好的 PyTorch 輪子&#xff1b;一種是自己從頭開始開始構建 PyTorch 輪子并且安裝。 使用輪子安裝 可以從我的 Gi…

Ansible fetch模塊詳解:輕松從遠程主機抓取文件

在自動化運維的過程中&#xff0c;我們經常需要從遠程主機下載文件到本地&#xff0c;以便進行分析或備份。Ansible的fetch模塊正是為了滿足這一需求而設計的&#xff0c;它可以幫助我們輕松地從遠程主機獲取文件&#xff0c;并將其保存到本地指定的位置。在這篇文章中&#xf…

【AI論文】生成式視頻模型是否通過觀看視頻學習物理原理?

摘要&#xff1a;AI視頻生成領域正經歷一場革命&#xff0c;其質量和真實感在迅速提升。這些進步引發了一場激烈的科學辯論&#xff1a;視頻模型是否學習了能夠發現物理定律的“世界模型”&#xff0c;或者&#xff0c;它們僅僅是復雜的像素預測器&#xff0c;能夠在不理解現實…