一文弄懂 Linux 系統調用函數之 exec 函數族

目錄

    • 簡介
    • 函數原型
    • 參數說明
    • 返回值
    • 函數區別
    • 使用示例
      • 采用參數列表傳遞參數,以 execl 為例
      • 采用參數數組傳遞參數,以 execv 為例
      • 調用 PATH 下可執行文件,以 execlp 為例
      • 使用新的環境變量給新進程,以 execle 為例
    • 更多內容

簡介

exec 函數族是 Linux 系統中的系統調用函數,它們都以 exec 開頭,共有 6 個,分別是 execlexecleexeclpexecvexecveexecvp,使用 exec 函數可以將當前的進程替換為一個新進程,且新進程與原進程具有相同的 PID。

函數原型

#include <unistd.h>extern char **environ;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 execvpe(const char *file, char *const argv[], char *const envp[]);

參數說明

  • path:指定要執行的可執行文件及其路徑,可以是相對路徑、也可以是絕對路徑。
  • arg:指定傳遞給可執行文件的一系列參數,以可變參數列表的形式,一般第一個參數為可執行文件的名稱,且最后一個參數必須是 NULL
  • file:若參數中包含"/"則視為路徑并在指定路徑下查找可執行文件,否則將在 PATH 環境變量指定的路徑中查找可執行文件。
  • envp:指定新進程的環境變量,不使用當前的環境變量。
  • argv:指定傳遞給可執行文件的一系列參數,以參數數組的形式,且該數組最后一個元素必須是 NULL

返回值

  • 成功:不返回,從新程序的 main 函數開始執行。
  • 失敗:返回 -1,繼續執行原程序。

函數區別

分別以函數中的字符 lpve 說明:

  • l:表示使用參數列表的形式傳遞參數。
  • p:表示使用文件名,若不指定路徑,將在 PATH 環境變量指定的路徑中查找可執行文件。
  • v:表示使用參數數組的形式傳遞參數。
  • e:表示要使用新的環境變量給新進程。

使用示例

采用參數列表傳遞參數,以 execl 為例

  • 示例程序
// main.c
#include <stdio.h>
#include <unistd.h>int main(void)
{printf("--- main begin ---\n");execl("./test", "test", "Hello World!", (char *)NULL);printf("--- main end ---\n");return 0;
}// test.c
#include <stdio.h>int main(int argc, char *argv[])
{printf("%s: %s \r\n", argv[0], argv[1]);return 0;
}
  • 執行效果如下:

采用參數數組傳遞參數,以 execv 為例

  • 示例程序
// main.c
#include <stdio.h>
#include <unistd.h>int main(void)
{char *argv[] = {"test", "Hello World!", (char *)NULL};printf("--- main begin ---\n");execv("./test", argv);printf("--- main end ---\n");return 0;
}// test.c
#include <stdio.h>int main(int argc, char *argv[])
{printf("%s: %s \r\n", argv[0], argv[1]);return 0;
}
  • 執行效果如下:

調用 PATH 下可執行文件,以 execlp 為例

  • 示例程序
// main.c
#include <stdio.h>
#include <unistd.h>int main(void)
{printf("--- main begin ---\n");execlp("ps", "ps", "-l", (char *)NULL);printf("--- main end ---\n");return 0;
}
  • 執行效果如下:

使用新的環境變量給新進程,以 execle 為例

  • 示例程序
// main.c
#include <stdio.h>
#include <unistd.h>int main(void)
{char *env_init[] = {"AA=aa", "BB=bb", NULL};printf("--- main begin ---\n");execle("./test", "test", "Hello World!", (char *)NULL, env_init);printf("--- main end ---\n");return 0;
}// test.c
#include <stdio.h>extern char **environ;int main(int argc, char *argv[])
{printf("%s: %s \r\n", argv[0], argv[1]);for (char **ptr = environ; *ptr != 0; ptr++){printf("%s\n", *ptr);}return 0;
}
  • 執行效果如下:

更多內容

  • CSDN博客:@Hello阿爾法
  • 嗶哩嗶哩:@Hello阿爾法
  • 知乎:@Hello阿爾法

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

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

相關文章

【Java】/*方法的使用-快速總結*/

目錄 一、什么是方法 二、方法的定義 三、實參和形參的關系 四、方法重載 五、方法簽名 一、什么是方法 Java中的方法可以理解為C語言中的函數&#xff0c;只是換了個名稱而已。 二、方法的定義 1. 語法格式&#xff1a; public static 返回類型 方法名 (形參列表) { //方…

windows server 2019 安裝 docker環境

一、根據官方說明進行安裝 , 看起來過程相當簡單, 但問題還是有的 準備 Windows 操作系統容器 | Microsoft Learn // 一個 powershell 腳本&#xff0c;該腳本配置環境以啟用與容器相關的 OS 功能并安裝 Docker 運行時。 Invoke-WebRequest -UseBasicParsing "https://r…

【Docker】Ubuntu下Docker的基本使用方法與常用命令總結

【Docker】docker的基本使用方法 鏡像image與容器container的關系基本命令- 查看 Docker 版本- 拉取鏡像- 查看系統中的鏡像- 刪除某個鏡像- 列出當前 Docker 主機上的所有容器&#xff0c;包括正在運行的、暫停的、已停止的&#xff0c;以及未運行的容器- 列出當前 Docker 主機…

【信息系統項目管理師知識點速記】溝通管理:管理溝通

管理溝通是確保項目信息流通順暢的關鍵流程,涉及到信息的收集、生成、傳播、存檔、檢索、監管及最終處理,以促進項目團隊與利益相關者的有效互動。這一過程不僅關乎信息的發布,更側重于信息的恰當格式與精準送達,同時鼓勵利益相關者的積極參與,包括信息補充、澄清和討論。…

《二十一》QT QML編程基礎

QML概述 QML&#xff08;Qt Meta-Object Language&#xff09;是一種聲明性語言&#xff0c;它被用于描述Qt框架中用戶界面的結構和行為。QML提供了一種簡潔、靈活的方式來創建動態和交互式的界面。 QML基于JavaScript語法&#xff0c;通過使用QML類型和屬性來定義界面的元素…

基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (三)

基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 大家繼續看 https://lilianweng.github.io/posts/2023-06-23-agent/的文檔內容 第二部分&#xff1a;內存 記憶的類型 記憶可以定義為用于獲取、存儲、保留以及隨后檢索信息的過程。人腦中有多…

Mac 使用:Micosoft Remote Desktop 遠程優化

Micosoft Remote Desktop遠程優化 服務器 遠程會話環境設置 WinR打開運行&#xff0c;輸入gpedit.msc 找到計算機配置->管理模板->Windows組件->遠程桌面服務->遠程桌面會話主機->遠程會話環境。下面這幾個打開&#xff0c;有效提高rdp性能。 rdp協議同時使用…

自動駕駛---Behavior Planning之EUDM

1 背景 在前面的博客中,為讀者朋友們闡述了自動駕駛Planning模塊基于MCTS行為規劃的文章《自動駕駛---Behavior Planning之MCTS》,博客中引用的論文的主要思想是以蒙特卡洛樹來實現行為規劃。今天,我們繼續探尋另一種行為規劃的策略,主角依然是香港科技大學。 熟悉的讀者大…

vim 文件內容替換 cat 合并文件

vim 文件內容替換 第一步&#xff1a;首先要進入末行模式&#xff08;在命令模式下輸入冒號:&#xff09; 第二步&#xff1a;根據需求替換內容 ① 只替換光標所在這一行的第一個滿足條件的結果&#xff08;只能替換1次&#xff09; :s/要替換的關鍵詞/替換后的關鍵詞 回…

計數排序,基數排序,桶排序

目錄 計數排序: 基數排序&#xff1a; 桶排序: 計數排序: 計數排序是一種非比較型整數排序算法&#xff0c;特別適用于一定范圍內的整數排序。它的核心思想是使用一個額外的數組&#xff08;稱為計數數組&#xff09;來計算每個值的出現次數&#xff0c;然后根據這些計數信…

C語言中錯誤處理的基本實現

引入頭文件依賴&#xff1a; 標準輸入輸出流&#xff1a;#include <stdio.h>獲取錯誤信息&#xff1a;#include <string.h>&#xff0c;strerror通過這個頭文件獲取文件流&#xff1a;#include <stdlib.h>&#xff0c;fprintf通過這個頭文件獲取錯誤編號&…

hadoop生態圈集群搭建(持續更新240512)

Hadoop生態圈 Linux1.修改ip地址2.重啟network服務3.安裝插件4.關閉防火墻5.創建用戶6.創建目錄7.修改目錄的所屬主和所屬組為lxy8.修改主機名:hadoop102 (注意名字后面不要加空格)9.修改hosts文件10.等插件都裝完后再重啟Linux11.把xshell的登錄用戶換成lxy &#xff08;注意&…

【TC3xx芯片】TC3xx芯片時鐘監控

目錄 前言 正文 1.時鐘監控概念 1.1 時鐘監控原理 1.2時鐘監控配置寄存器

Node.js 的補充適用場景

Node.js 的適用場景相當廣泛&#xff0c;以下再補充一些具體的使用場景&#xff1a; 服務器端應用開發&#xff1a; Node.js特別適合于構建高性能、高并發、低延遲的服務器端程序。它可以用來開發Web服務器、API服務器、實時通訊服務器等。Node.js的高性能和事件驅動的非阻塞I…

day09-常用API異常

1.時間日期類 1.1 Date類&#xff08;應用&#xff09; 計算機中時間原點 1970年1月1日 00:00:00 時間換算單位 1秒 1000毫秒 Date類概述 Date 代表了一個特定的時間&#xff0c;精確到毫秒 Date類構造方法 方法名說明public Date()分配一個 Date對象&#xff0c;并初始化…

【大數據】HDFS

文章目錄 [toc]HDFS 1.0NameNode維護文件系統命名空間存儲元數據解決NameNode單點問題 SecondaryNameNode機架感知數據完整性校驗校驗和數據塊檢測程序DataBlockScanner HDFS寫流程HDFS讀流程HDFS與MapReduce本地模式Block大小 HDFS 2.0NameNode HANameNode FederationHDFS Sna…

使用注解的方式進行配置RabbitMQ

引入依賴&#xff1a; <dependency><groupId>org.springframework.amqp</groupId><artifactId>spring-rabbit-test</artifactId><scope>test</scope></dependency> 配置application.yml server:port: 8082 spring:rabbitmq…

pyqt5報錯:AttributeError: ‘mywindow‘ object has no attribute ‘setCentralWidget‘

第一種解決方法是&#xff1a;AttributeError: ‘mywindow‘ object has no attribute ‘setCentralWidget‘_attributeerror: mywindow object has no attribute-CSDN博客 第二種解決方法是&#xff08;推薦&#xff09;&#xff1a; 直接把這段代碼復制在 ui轉 py文件的后面…

什么是JVM中的程序計數器

在計算機的體系結構中&#xff1a; 程序計數器&#xff08;Program Counter&#xff09;&#xff0c;通常縮寫為 PC&#xff0c;是計算機體系結構中的一個寄存器&#xff0c;用于存儲下一條指令的地址。程序計數器是控制單元的一部分&#xff0c;它的作用是確保程序能夠按正確…

用 Python 和 AkShare 進行個股數據清洗:簡易多功能方法

標題:用 Python 和 AkShare 進行個股數據清洗:簡易多功能方法 簡介: 本文介紹了如何使用 Python 和 AkShare 庫對個股數據進行清洗和處理。個股數據經常需要進行清洗以用于分析、建模或可視化。我們將介紹一些簡單但功能強大的方法,包括數據加載、缺失值處理、重復值檢測和…