10-LINUX--进程的替换

一. 进程的替换

1.替换原理

用fork()创建子进程后,子进程调用exec系列函数执行另一个程序。当子进程调用execl系列函数时,多用的空间和数据完全被新程序替代,从新程序的mian()开始执行。

强调:exec系列函数不创建新进程,所以新进程的id不会改变。

2.exec系列替换函数

cs 复制代码
#include<unistd.h>

int execl(const char *path, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char *const envp[]);
int execv(const char *path, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);
int execlp(const char *file, const char *arg, ...);
int execvp(const char *file, char *const argv[]);

参数解释:

1)函数execl、execle、execlp要求将新程序的每个命令行参数都说明为一个单独的参数,这种参数表以空指针结尾。

2)对于另外3个函数,则先构造一个指向各参数的指针数组,然后将该数组地址作为这3个函数的参数。

3.替换过程

(1).获取命令行

(2).解析命令行

(3).建立一个子进程fork()

(4).替换子进程(exec)

(5).父进程等待子进程退出

4.测试用例

cs 复制代码
include<fcntL.h>
int main(int argc, chart argv[], chart envp[])
printf("pid=%dIn ppid=%d)n",getpid(), getppid());
//成功不返回
//execl("/usr/bin/ps","ps", "-f", (char*)0)://char*e 表示参数结束
//execlp("ps","ps", "-F", (char*)0);1//不用加指定路径,只需要说命令的名:
//execle("/usr/bin/ps","ps", "-f", (char*)o, envp);
char* nyargv[J]-C"pS", "-f", oj;
execv("/usr/bin/ps", nyargv);
execvp("ps", myargv);
execve("/usr/bin/ps", myargv, enyp);
printf("execl errln");exit(0);

5.fork 和 exec 联合使用创建一个全新的进程

如下示例,当前主程序复制产生一个子进程,子进程用新程序"b"替换自身。 当前主程序如下:

cs 复制代码
#include <stdio.h>   
#include <stdlib.h>   
#include <unistd.h>   
#include <assert.h>   
#include <string.h>   
#include <fcntl.h>   
#include <errno.h>   
int main(int argc, char* argv[],char* envp[])   
 {       
printf("main pid=%d\n",getpid());      
pid_t pid = fork();   
assert( pid != -1 );   
 if ( pid == 0 )   
     {            
char * myargv[] = {"b","hello","abc","123",(char*)0};   

//char * myenvp[] = {"MYSTR=hello","VAL=100",(char*)0};      
execve("./b",myargv,envp);   
perror("execl error");   
 }   
exit(0);   
wait(NULL);   
printf("main over\n");   
} 

新替换的b程序:

cs 复制代码
 #include <stdio.h>   
 #include <stdlib.h>   
 #include <unistd.h>   
 #include <assert.h>   
 #include <string.h>   
 int main(int argc, char* argv[],char* envp[]) 
   {       
printf("b pid=%d\n",getpid());        
int i = 0;   
            
printf("argc=%d\n",argc);   
     for( ; i < argc; i++ )   
     {            
printf("argv[%d]=%s\n",i,argv[i]);  
     }      
     for( i = 0; envp[i] != NULL; i++ )   
     {            
printf("envp[%d]=%s\n",i,envp[i]);   
     }          
 }  
exit(0):
}
相关推荐
库玛西15 分钟前
深入浅出传输层:UDP 与 TCP 协议全景指南
linux·服务器·网络·c++·笔记·tcp/ip·udp
随便做点啥25 分钟前
32卡-64G-910B4-16后端-(Qwen3.8-27B-W8A8)集群部署报告
运维·服务器·经验分享·docker·vllm
薛定谔的悦4 小时前
储能 EMS 的功率策略:从一块电表到一次逆流的 200 毫秒
大数据·linux·能源·储能·bms
2601_962218477 小时前
万象生鲜系统区块链溯源技术帮助生鲜企业搭建食品安全数字化体系
大数据·运维·微服务·云原生·架构
智塑未来7 小时前
中小公司在线文档选型:从协作入口到安全边界
运维·安全
新时代牛马7 小时前
Linux 内核入门地图:架构、源码目录与五大子系统
linux·运维·架构
智购科技无人售货机厂家7 小时前
2026自动售货机制冷系统维护指南:从散热器清洁到压缩机换油的工程实践~YH
运维·redis·物联网·缓存·架构
剑客的茶馆7 小时前
开发者,运维怎样转行FDE?
运维·ai·开发·fde
Julien20047 小时前
控制 SELinux 文件上下文
linux·运维·服务器
sulikey8 小时前
Linux Core Dump 完全指南:从原理到实战的崩溃调试手册。什么是core dump?程序报错core dumped怎么办?
linux·服务器·操作系统·调试·coredump