進程替換講解

1. 基本概念

1.1 進程替換 vs. 進程創建

  • 進程創建:使用fork()clone()等系統調用創建一個新的子進程,子進程是父進程的副本,擁有相同的代碼和數據。
  • 進程替換:使用exec系列函數在當前進程中加載并執行一個新的程序,替換掉當前進程的映像,但保留PID、文件描述符等資源。

1.2?exec系列函數

exec系列函數用于在當前進程中執行一個新程序。常見的exec函數包括:

這些函數的命名規則如下:

  • 前綴exec
  • 中間部分
    • l(list):參數以列表形式傳遞。
    • v(vector):參數以數組形式傳遞。
  • 后綴
    • e:允許傳遞環境變量。
    • p:使用PATH環境變量來查找可執行文件。

2. 常用的exec函數

2.1?execl()

函數原型:

?

#include <unistd.h>int execl(const char *path, const char *arg, ... /* (char  *) NULL */);

參數:

  • path:要執行的可執行文件的路徑。
  • arg:第一個參數,通常是程序名。
  • ...:可變參數列表,以NULL結尾。

?例子:

#include <stdio.h>
#include <unistd.h>int main() {printf("Before execl\n");execl("/bin/ls", "ls", "-l", NULL);// 如果execl成功,以下代碼不會執行perror("execl failed");return 1;
}

2.2?execv()

函數原型:

#include <unistd.h>int execv(const char *path, char *const argv[]);

參數:

  • path:要執行的可執行文件的路徑。
  • argv:參數數組,以NULL結尾。

例子:

#include <stdio.h>
#include <unistd.h>int main() {char *args[] = { "ls", "-l", NULL };printf("Before execv\n");execv("/bin/ls", args);// 如果execv成功,以下代碼不會執行perror("execv failed");return 1;
}

2.3?execlp()

函數原型:

#include <unistd.h>int execlp(const char *file, const char *arg, ... /* (char  *) NULL */);

參數:

  • file:可執行文件名,會在PATH環境變量中查找。
  • arg:第一個參數,通常是程序名。
  • ...:可變參數列表,以NULL結尾。

例子:

#include <stdio.h>
#include <unistd.h>int main() {printf("Before execlp\n");execlp("ls", "ls", "-l", NULL);// 如果execlp成功,以下代碼不會執行perror("execlp failed");return 1;
}

2.4?execvp()

函數原型:

#include <unistd.h>int execvp(const char *file, char *const argv[]);

參數:

  • file:可執行文件名,會在PATH環境變量中查找。
  • argv:參數數組,以NULL結尾。

例子:

#include <stdio.h>
#include <unistd.h>int main() {char *args[] = { "ls", "-l", NULL };printf("Before execvp\n");execvp("ls", args);// 如果execvp成功,以下代碼不會執行perror("execvp failed");return 1;
}

2.5?execle()

函數原型:

#include <unistd.h>int execle(const char *path, const char *arg, ... /* (char  *) NULL, char * const envp[] */);

參數:

  • path:要執行的可執行文件的路徑。
  • arg:第一個參數,通常是程序名。
  • ...:可變參數列表,以NULL結尾。
  • envp:環境變量數組。

例子:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main() {char *env[] = { "PATH=/bin", NULL };printf("Before execle\n");execle("/bin/ls", "ls", "-l", NULL, env);// 如果execle成功,以下代碼不會執行perror("execle failed");return 1;
}

2.6 execvpe()

#include <unistd.h>int execvpe(const char *file, char *const argv[], char *const envp[]);
?參數
  • file:要執行的可執行文件的名稱。如果?file?中包含斜杠?(/),則將其視為路徑名,直接嘗試執行。(如果?file?不包含斜杠,則會在?PATH?環境變量指定的目錄中查找可執行文件。)

  • argv:參數數組,以?NULL?結尾。argv[0]?通常是程序名。

  • envp:環境變量數組,以?NULL?結尾。每個環境變量以?"NAME=VALUE"?的形式表示。

例子:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main() {// 要執行的程序及其參數char *args[] = { "printenv", "MY_VAR", NULL };// 自定義環境變量char *env[] = { "MY_VAR=HelloWorld", "PATH=/bin:/usr/bin", NULL };printf("Before execvpe\n");// 執行程序if(execvpe("printenv", args, env) == -1) {perror("execvpe failed");exit(1);}// 如果 execvpe 成功,以下代碼不會執行return 0;
}

?

?

?

2.7?execve()(這個上面查庫沒有,要單獨查)

函數原型:

?

?

參數:

  • pathname:要執行的可執行文件的路徑。
  • argv:參數數組,以NULL結尾。
  • envp:環境變量數組。

例子:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main() {char *args[] = { "ls", "-l", NULL };char *env[] = { "PATH=/bin", NULL };printf("Before execve\n");execve("/bin/ls", args, env);// 如果execve成功,以下代碼不會執行perror("execve failed");return 1;
}

?

3. 錯誤處理

大多數exec函數在成功時不會返回,如果失敗則返回-1,并設置errno變量。常見的錯誤包括:

  • ENOENT:文件不存在。
  • EACCES:權限不足。
  • ENOEXEC:可執行文件格式錯誤。

例子:

#include <stdio.h>
#include <unistd.h>int main() {if(execl("/bin/ls", "ls", "-l", NULL) == -1) {perror("execl failed");}// 如果execl成功,以下代碼不會執行return 1;
}

?

?

?

?

?

?

?

?

?

?

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

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

相關文章

【微服務】SpringBoot + Docker 實現微服務容器多節點負載均衡詳解

目錄 一、前言 二、前置準備 2.1 基本環境 2.2 準備一個springboot工程 2.2.1 準備幾個測試接口 2.3 準備Dockerfile文件 2.4 打包上傳到服務器 三、制作微服務鏡像與運行服務鏡像 3.1 拷貝Dockerfile文件到服務器 3.2 制作服務鏡像 3.3 啟動鏡像服務 3.4 訪問一下服…

1.2.2.1.4 數據安全發展技術發展歷程:高級公鑰加密方案——同態加密

引言 在密碼學領域&#xff0c;有一種技術被圖靈獎得主、著名密碼學家Oded Goldreich譽為"密碼學圣杯"&#xff0c;那就是全同態加密&#xff08;Fully Homomorphic Encryption&#xff09;。今天我們就來聊聊這個神秘而強大的加密方案是如何從1978年的概念提出&…

vllm量化03—INT4 W4A16

本系列基于Qwen2.5-7B&#xff0c;學習如何使用vllm量化&#xff0c;并使用benchmark_serving.py、lm_eval 測試模型性能和評估模型準確度。 測試環境為&#xff1a; OS: centos 7 GPU: nvidia l40 driver: 550.54.15 CUDA: 12.3本文是該系列第3篇——INT4 W4A16 一、量化 f…

第二十五天打卡

常見報錯類型 try-except-else-finally 語句 首先執行try語句&#xff0c;若正確直接執行else語句 若try語句發生錯誤&#xff0c;則判斷錯誤類型&#xff0c;執行錯誤類型對應的except語句&#xff0c;不執行else語句 finally語句無條件執行&#xff0c;多用于資源保存&…

城市掃街人文街頭紀實膠片電影感Lr調色預設,DNG/手機適配濾鏡!

調色詳情 城市掃街人文街頭紀實膠片電影感 Lr 調色是通過 Lightroom&#xff08;Lr&#xff09;軟件&#xff0c;對城市街頭抓拍的人文紀實照片進行后期調色處理。旨在賦予照片如同膠片拍攝的質感以及電影般濃厚的敘事氛圍&#xff0c;不放過每一個日常又珍貴的瞬間&#xff0c…

【hadoop】Kafka 安裝部署

一、Kafka安裝與配置 步驟&#xff1a; 1、使用XFTP將Kafka安裝包kafka_2.12-2.8.1.tgz發送到master機器的主目錄。 2、解壓安裝包&#xff1a; tar -zxvf ~/kafka_2.12-2.8.1.tgz 3、修改文件夾的名字&#xff0c;將其改為kafka&#xff0c;或者創建軟連接也可&#xff1…

UDP 多點通信

一、setsockopt/getsockopt 函數詳解 1. 函數原型 c #include <sys/socket.h> int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);…

說一說Node.js高性能開發中的I/O操作

眾所周知&#xff0c;在軟件開發的領域中&#xff0c;輸入輸出&#xff08;I/O&#xff09;操作是程序與外部世界交互的重要環節&#xff0c;比如從文件讀取數據、向網絡發送請求等。這段時間&#xff0c;也指導項目中一些項目的開發工作&#xff0c;發現在Node.js運用中&#…

Charles抓包并破解ProtoBuf請求

安裝Charles并抓包 如果是外網的需要root安裝一系列證書等&#xff0c;詳細見參考文章&#xff1a; 在雷電模擬器安卓7.0上使用Charles抓包詳細教程 遇到如下問題&#xff1a; 1.粘貼到目錄/system/etc/security/cacerts內&#xff0c;粘貼不了。需要打開這個 2.模擬器wifi打…

Odoo 18 安全組與訪問權限管理指南

Odoo 18 安全組與訪問權限管理指南 一、準備工作&#xff1a;在自定義模塊中創建安全配置文件 創建 security 文件夾 在自定義模塊內創建名為 security 的文件夾&#xff0c;用于存放安全組和訪問權限的定義文件。 二、定義模型訪問權限&#xff1a;ir.model.access.csv 文…

使用lldb查看Rust不同類型的結構

目錄 前言 正文 標量類型 復合類型——元組 復合類型——數組 函數 &str struct 可變數組vec Iter String Box Rc Arc RefCell Mutex RwLock Channel 總結 前言 筆者發現這個lldb挺好玩的&#xff0c;可以查看不同類型的結構&#xff0c;雖然這好像是C的東…

uniapp使用ui.request 請求流式輸出

正文&#xff1a; 在現代Web開發中&#xff0c;實時數據流和長時間運行的請求變得越來越常見&#xff0c;尤其是在處理大量數據或進行實時通信時。在這種情況下&#xff0c;uniapp 提供的 ui.request 請求方法可以幫助我們輕松實現流式輸出請求。本文將介紹如何使用 uni.reques…

如何恢復被勒索軟件加密的服務器文件(解密與備份策略)

針對勒索軟件加密文件的恢復和解密策略&#xff0c;結合當前數據安全最佳實踐&#xff0c;整理應對指南如下&#xff1a; 一、文件解密與修復方法 立即隔離設備? 斷開網絡連接并禁用共享功能&#xff0c;防止病毒橫向傳播 通過文件后綴異常&#xff08;如.locked、.wxx&…

JS,ES,TS三者什么區別

Java Script(JS)、ECMAScript(ES)、TypeScript(TS) 的核心區別與關聯的詳細解析,結合技術背景、設計目標及應用場景展開說明: 一、核心定義與關系 JavaScript(JS) 定義:一種動態類型、基于原型的腳本語言,由 Netscape 公司于 1995 年首次開發,用于網頁交互功能。角…

【MapReduce入門】深度解析MapReduce:定義、核心特點、優缺點及適用場景

目錄 1 什么是MapReduce&#xff1f; 2 MapReduce的核心特點 2.1 分布式處理 2.2 容錯機制 3 MapReduce的完整工作流程 4 MapReduce的優缺點分析 4.1 優勢 4.2 局限性 5 MapReduce典型應用場景 5.1 適用場景 5.2 不適用場景 6 MapReduce與其他技術的對比 7 總結 1…

【Redis】分布式鎖的實現

目錄 一、本地鎖存在的問題 二、redis實現分布式鎖原理 三、使用示例 四、鎖誤刪問題 解決思路 獲取鎖和釋放鎖代碼優化 五、鎖釋放的原子性問題 解決思路&#xff08;Lua腳本&#xff09; 使用流程 總結 大家好&#xff0c;我是千語。上期給大家講了使用悲觀鎖來解決…

Unity3D對象池設計與實現詳解

前言 在Unity3D中&#xff0c;對象池&#xff08;Object Pooling&#xff09;是一種優化技術&#xff0c;用于減少頻繁實例化和銷毀對象帶來的性能開銷。以下是對象池的詳細設計和實現步驟&#xff1a; 對惹&#xff0c;這里有一個游戲開發交流小組&#xff0c;希望大家可以點…

[Spring]-組件的生命周期

組件生命周期 認識組件的聲明周期 實驗1 通過Bean指定組件的生命周期 package com.guigu.spring.ioc.bean;Data public class User {private String username;private String password;private Car car;Autowiredpublic void setCar(Car car) {System.out.println("自動…

【golang】網絡數據包捕獲庫 gopacket

詳解 github.com/google/gopacket/pcap 包 github.com/google/gopacket/pcap 是 Go 語言中一個強大的網絡數據包捕獲庫&#xff0c;它是 gopacket 項目的一部分&#xff0c;提供了對 libpcap&#xff08;Linux/Unix&#xff09;和 WinPcap&#xff08;Windows&#xff09;的 G…

RBTree的模擬實現

1&#xff1a;紅黑樹的概念 紅?樹是?棵?叉搜索樹&#xff0c;他的每個結點增加?個存儲位來表?結點的顏?&#xff0c;可以是紅?或者??。通過對任何?條從根到葉?的路徑上各個結點的顏?進?約束&#xff0c;紅?樹確保沒有?條路徑會?其他路徑?出2倍&#xff0c;因…