P11 Linux進程編程exec族函數

前言? ??

? ? ? ? ? ? ? ? ??

🎬 個人主頁:@ChenPi

🐻推薦專欄1: 《Linux C應用編程(概念類)_@ChenPi的博客-CSDN博客》????

🔥 推薦專欄2: 《C++_@ChenPi的博客-CSDN博客》???

🛸推薦專欄3: ??????《鏈表_@ChenPi的博客-CSDN博客 》 ???
🌺本篇簡介 ?:? Linux進程在運行中我們如何進入到另一個進程呢?

? ? ? ? ? ? ? ? ? ? ? ? ?我們可以使用exec系統調用

Linux 是一個多用戶多任務的操作系統,每個用戶可以同時運行多個程序

進程是程序運行的主體,包括進程的創建,調度和消亡的整個過程

當用戶執行一個指令或者啟動一個程序時,就創建了一個進程

一個運行的程序也可能有多個進程。

每個進程將被分配各種資源 ? ?

一 exec族函數

1.1 exec族函數函數的作用:

我們用fork函數創建新進程后,經常會在新進程中調用exec函數去執行另外一個程序。當進程調用exec函數時,該進程被完全替換為新程序。因為調用exec函數并不創建新進程,所以前后進程的ID并沒有改變。

1.2 exec函數族分別是:execl, execlp, execle, execv, execvp, execvpe
函數原型:

#include <unistd.h> extern char **environ; 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 execvpe(const char *file, char *const argv[], char *const envp[]); 
  • 返回值:
  • exec函數族的函數執行成功后不會返回,調用失敗時,會設置errno并返回-1,然后從原程序的調用點接著往下執行。
  • 參數說明:
  • path:可執行文件的路徑名字
  • arg:可執行程序所帶的參數,第一個參數為可執行文件名字,沒有帶路徑且arg必須以NULL結束
  • file:如果參數file中包含/,則就將其視為路徑名,否則就按 PATH環境變量,在它所指定的各目錄中搜尋可執行文件。

1.3 exec族函數的區別??

1.3.1?execl()和 execv()的區別

execl()和 execv()都是基本的 exec 函數,都可用于執行一個新程序,它們之間的區別在于:

參數格式不同,參數 path 意義和格式都相同,指向新程序的路徑名,既可以是絕對路徑、也可以是相對路徑。execl()和 execv()不同的在于第二個參數,execv()的argv 參數與 execve()的 argv 參數相同,也是字符串指針數組;而 execl()把參數列表依次排列,使 用可變參數形式傳遞,本質上也是多個字符串,以 NULL 結尾,如下所示:

// execv 傳參 
char *arg_arr[5]; 
/*參數 argv 則指定了傳遞給新程序的命令行參數。是一個字符串數組,
該數組對應于 main(int argc, char *argv[])函數的第二個參數 argv,
且格式也與之相同,是由字符串指針所組成的數組,以 NULL 結束。*/argv[0]對應的便是新程序自身路徑名。 
arg_arr[0] = "./newApp"; 
arg_arr[1] = "Hello"; 
arg_arr[2] = "World"; 
arg_arr[3] = NULL; 
execv("./newApp", arg_arr); // execl 傳參 
execl("./newApp", "./newApp", "Hello", "World", NULL); 

1.3.2?execlp()和 execvp()的區別

execlp()和 execvp()在 execl()和 execv()基礎上加了一個 p,這個 p 其實表示的是 PATH;execl()和execv()要求提供新程序的路徑名,而 execlp()和 execvp()則允許只提供新程序文件名,系統會在由 環境變量 PATH 所指定的目錄列表中尋找相應的可執行文件,如果執行的新程序是一個 Linux 命 令,這將很有用;當然,execlp()和 execvp()函數也兼容相對路徑和絕對路徑的方式。

1.3.1?execle()和 execve()的區別

execle()和 execvpe()這兩個函數在命名上加了一個 e,這個 e 其實表示的是 environment 環境變量, 意味著這兩個函數可以指定自定義的環境變量列表給新程序,參數envp與系統調用execve()的envp參數相同,也是字符串指針數組,使用方式如下所示:

// execvpe 傳參 
char *env_arr[5] = {"NAME=app", "AGE=25", "SEX=man", NULL}; 
char *arg_arr[5]; arg_arr[0] = "./newApp"; 
arg_arr[1] = "Hello"; 
arg_arr[2] = "World";
arg_arr[3] = NULL;
execvpe("./newApp", arg_arr, env_arr); // execle 傳參 
execle("./newApp", "./newApp", "Hello", "World", NULL, env_arr); 

二 exec族函數使用示例

6 個 exec 庫函數運行 ls 命令,并加入參數-li。

2.1 execl

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>void main()
{char ret = execl("/bin/ls","ls","-li",NULL);if(-1 == ret)  //調用失敗返回-1perror("");
}

2.2?execv

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>void main()
{char *canshu[] = {"ls","-li",NULL};execv("/bin/ls",canshu);
}

2.3?execlp

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>void main()
{execlp("ls","ls","-li",NULL);
}

2.4?execvp

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>void main()
{char *canshu[] = {"ls","-li",NULL};execvp("ls",canshu);
}

2.5?execle

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
char *env_init[] = {"AA=aa","BB=bb",NULL};  //作為參數傳到下個執行文件void main()
{execle("./test","test",NULL,env_init);}

2.6?execve

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>void main()
{char *env_init[] = {"AA=aa","BB=bb",NULL};  //作為參數傳到下個執行文件char *canshu[] = {"test","-li",NULL};execve("./test",canshu,env_init);}

?2.7 總結:?

  • l : 使用參數列表
  • p:使用文件名,并從PATH環境進行尋找可執行文件
  • v:應先構造一個指向各參數的指針數組,然后將該數組的地址作為這些函數的參數。
  • e:多了envp[]數組,使用新的環境變量代替調用進程的環境變量

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

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

相關文章

Java 簡易版 UDP 多人聊天室

服務端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{public static ServerSocket server_socket;public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []args){try{…

算法通關村第五關—LRU的設計與實現(黃金)

LRU的設計與實現 一、理解LRU的原理 LeetCode146:運用你所掌握的數據結構&#xff0c;設計和實現一個LRU(最近最少使用)緩存機制 實現LRUCache類&#xff1a; LRUCache(int capacity) 以正整數作為容量capacity初始化 LRU 緩存 int get(int key) 如果關鍵字key存在于緩存中&a…

數據可視化|jupyter notebook運行pyecharts,無法正常顯示“可視化圖形”,怎么解決?

前言 本文是該專欄的第39篇,后面會持續分享python數據分析的干貨知識,記得關注。 相信有些同學在本地使用jupyter notebook運行pyecharts的時候,在代碼沒有任何異常的情況下,無論是html還是notebook區域,都無法顯示“可視化圖形”,界面區域只有空白一片。遇到這種情況,…

SQL(COALESCE)

zstarling 非空值查找及替換COALESCE 非空值查找及替換COALESCE 新語法SQL COALESCE(staff_no,staff_no1,)詳解 在SQL中&#xff0c;COALESCE函數用于返回一組表達式中的第一個非NULL值。它接受兩個或多個參數&#xff0c;并按參數順序依次判斷每個參數是否為NULL&#xff0c…

如何才能保證績效考核的有效性呢?

績效管理是現代人力資源管理的核心&#xff0c;做好績效考核是做好績效管理的重要手段。但企業績效考核的設計往往缺乏針對性和科學性&#xff0c;績效考核工作也常常停留在形式上&#xff0c;最終沒能為提高組織效率提供幫助&#xff0c;還消耗員工與管理者的時間、精力。于是…

Nginx服務優化以及防盜鏈

1. 隱藏版本號 以在 CentOS 中使用命令 curl -I http://192.168.66.10 顯示響應報文首部信息。 查看版本號 curl -I http://192.168.66.10 1. 修改配置文件 vim /usr/local/nginx/conf/nginx.conf http {include mime.types;default_type application/octet-stream;…

京東數據運營(京東API接口):10月投影儀店鋪數據分析

鯨參謀監測的京東平臺10月份投影儀市場銷售數據已出爐&#xff01; 10月份&#xff0c;環同比來看&#xff0c;投影儀市場銷售均上漲。鯨參謀數據顯示&#xff0c;今年10月&#xff0c;京東平臺投影儀的銷量為16萬&#xff0c;環比增長約22%&#xff0c;同比增長約8%&#xff1…

鴻蒙應用開發ArkTS基礎組件的使用

語雀知識庫地址&#xff1a;語雀HarmonyOS知識庫 飛書知識庫地址&#xff1a;飛書HarmonyOS知識庫 本文示例代碼地址&#xff1a;Gitee 倉庫地址 嗨&#xff0c;各位好呀&#xff0c;我是小白 上一篇文章我為大家介紹了如何使用 ArkTS 開發鴻蒙應用&#xff0c;對 HarmonyOS 項…

大文件分割,合并------C++ ------fstream

將一個大文件(這里測試文件為5.2G)切分為指定大小的文件,然后在把分割后的文件拼接合并為分割前的源文件 #include <boost/timer.hpp> // 計時函數#include <filesystem> #include <fstream> #include <vector> // 分隔后文件夾的格式, 原文件名_chun…

探索開源游戲的樂趣與無限可能 | 開源專題 No.47

CleverRaven/Cataclysm-DDA Stars: 9.0k License: NOASSERTION Cataclysm&#xff1a;Dark Days Ahead 是一個回合制的生存游戲&#xff0c;設定在一個后啟示錄世界中。盡管有些人將其描述為 “僵尸游戲”&#xff0c;但 Cataclysm 遠不止于此。在這個殘酷、持久、程序生成的世…

【原創】【一類問題的通法】【真題+李6卷6+李4卷4(+李6卷5)分析】合同矩陣A B有PTAP=B,求可逆陣P的策略

【鋪墊】二次型做的變換與相應二次型矩陣的對應&#xff1a;二次型f&#xff08;x1&#xff0c;x2&#xff0c;x3&#xff09;xTAx&#xff0c;g&#xff08;y1&#xff0c;y2&#xff0c;y3&#xff09;yTBy ①若f在可逆變換xPy下化為g&#xff0c;即P為可逆陣&#xff0c;有P…

Unity 通過鍵盤鼠標控制物體移動、旋轉、縮放的方法

在Unity中&#xff0c;使用鍵盤ADWS鍵控制物體移動&#xff0c;通過鼠標左鍵控制物體旋轉&#xff0c;鼠標中鍵控制物體縮放是再常見不過的方法。 方法如下&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine;public class MoveCo…

數字系統設計(EDA)實驗報告【出租車計價器】

一、問題描述 題目九&#xff1a;出租車計價器設計&#xff08;平臺實現&#xff09;★★ 完成簡易出租車計價器設計&#xff0c;選做停車等待計價功能。 1、基本功能&#xff1a; &#xff08;1&#xff09;起步8元/3km&#xff0c;此后2元/km&#xff1b; &#xff08;2…

紅隊攻防實戰之ThinkPHP-RCE集錦

你若不勇敢&#xff0c;誰又可以替你堅強&#xff1f; ThinkPHP 2.x RCE漏洞 1、查詢phpinfo() 2、任意代碼執行 3、Getshell 蟻劍連接&#xff1a; ThinkPHP5 5.0.23 RCE漏洞 發送數據包&#xff1a; 成功執行id命令&#xff1a; 工具驗證 ThinkPHP5 SQL注入漏洞 &&am…

什么是神經網絡的非線性

大家好啊&#xff0c;我是董董燦。 最近在寫《計算機視覺入門與調優》&#xff08;右鍵&#xff0c;在新窗口中打開鏈接&#xff09;的小冊&#xff0c;其中一部分說到激活函數的時候&#xff0c;談到了神經網絡的非線性問題。 今天就一起來看看&#xff0c;為什么神經網絡需…

cuda函數的前綴作用

文章目錄 cuda函數的前綴作用1、前綴作用2、global3、device4、host cuda函數的前綴作用 1、前綴作用 函數執行環境標識符&#xff0c;即表明函數在哪里被調用 2、global __global__修飾的函數是核函數&#xff0c;這些函數在GPU上執行&#xff0c;但是需要在CPU上調用。 g…

激光打標機在智能手表上的應用:科技與時尚的完美結合

隨著科技的飛速發展&#xff0c;智能手表已經成為我們日常生活中不可或缺的智能設備。而在智能手表制造中&#xff0c;激光打標機扮演著至關重要的角色。本文將詳細介紹激光打標機在智能手表制造中的應用&#xff0c;以及其帶來的優勢和影響。 ? 一、激光打標機在智能手表制…

按訂單周期結算的產品成本

原文地址&#xff1a;Product Cost By Order Cycle | SAP Blogs 產品成本核算是每個制造企業的控制部門的核心職責之一&#xff0c;根據其產品和生產的性質&#xff0c;每個企業的成本核算有所不同。它支持組織在其他職能領域做出大量戰略決策。在過去幾年中獲得了 SAP 產品成本…

Vite4、Vue3、Axios 針對請求模塊化封裝搭配自動化導入(簡單易用)

針對請求模塊化封裝搭配自動化導入&#xff08;簡單易用&#xff09; 目標目錄目標代碼前提步入正題src / utils / index.jssrc /api / index.jssrc /api / request.jssrc /api / service.jssrc /api / utils.jssrc /api / modules / demo.js 自動化配置vite.config.jseslint 校…

QEMU環境調試方法

本文從調試的角度出發&#xff0c;分享QEMU調試過程中的常見調試方法。 1.如何查看makefile構建過程執行的命令&#xff1f; 為了深入理解ucore操作系統實驗的編譯鏈接細節&#xff0c;需要知道makefile在執行的過程中一步一步的指令執行情況。然而大部分的工程中&#xff0c;…