<Linux>进程程序替换

本文介绍了Linux中进程程序替换的概念,旨在使父进程与子进程执行不同程序。通过exec函数,如execv、execvp等,可以实现不创建新进程的情况下替换代码和数据。在替换后,原有的堆和栈被重建,以执行新的程序。了解这些函数的用法和注意事项对于理解Linux进程操作至关重要。

进程程序替换为的是为了使父进程与子进程能够执行不同程序

因为父进程通过fork()创建的子进程,与父进程执行相同程序,当我们想让子进程执行不同的程序时,就需要使用exec函数将子进程与新程序替换

进程程序替换需要注意几点

  • 程序替换不会创建新进程,也不会销毁进程
  • 替换代的码和数据(从一个可执行文件中来)
  • 替换后原有的堆和栈中的数据全都不要了,根据新的代码 的执行过程重新构建堆和栈的内同,类似于双击exe执行一个程序的过程(操作系统的加载器模块)

exec 函数族 其中参数有差异,底层原理差不多相同
exrcl 中的l意为 list,这个exec函数是一个可变参数列表的函数

函数功能
execl可变参数列表的函数
execlp自动从PATH路径中找到可执行程序
execle需要传入代替换程序路径,需要程序员自己管理环境变量
参数的含义依次是:替换的程序路径,所要替换的程序,命令行参数,NULL识别结束
execl("/usr/bin/ls","ls","-l",NULL);

execlp("./program","program",NULL);

execle需要自定环境变量
char* env[3] = {0};
env[0] = "PATH=/home/user/path";
env[1] = "MYENV=abc";
env[2] = NULL;
execle("./program","program",NULL,env);

execv v意为数组,命令行参数以数组形式输入

同类型函数有 execv() , execvp(),execve() 的特性与上面所给的表格中功能相同

参数的含义依次是:替换的程序路径,命令行参数数组
char* argv[3] = {0};
argv[0] = "program";
argv[1] = "-a";
argv[2] = NULL; //数组中的最后一个以NULL结尾
execv("./program",argv);

如果在PATH环境变量中添加了当前路径,则可以省略输入路径地址
execvp("program",argv)

关于exec函数族的转化关系

在这里插入图片描述

https://mengkang.net/book-c/ch30s03.html

[root@xran-cudu0808-0 home]# ps aux | grep 'Z' USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 293 0.0 0.0 0 0 pts/0 Z< 02:21 0:00 [odsNameServer] <defunct> root 296 0.2 0.0 0 0 pts/0 Z< 02:21 0:05 [xranOamCtrl] <defunct> root 300 0.0 0.0 0 0 pts/0 Z 02:21 0:00 [python3] <defunct> root 317 0.0 0.0 0 0 pts/0 Z< 02:21 0:00 [pmon.sh] <defunct> root 390 0.1 0.0 0 0 pts/0 Z 02:21 0:02 [xranUpCtrl] <defunct> root 398 0.0 0.0 0 0 pts/0 Z< 02:21 0:01 [xranGnbCtrl] <defunct> root 407 0.0 0.0 0 0 pts/0 Z< 02:21 0:01 [xranCellCtrl] <defunct> root 452 0.0 0.0 0 0 pts/0 Z< 02:22 0:00 [xranProxyCtrl] <defunct> root 459 0.1 0.0 0 0 pts/0 Z 02:22 0:02 [xranDuCtrl] <defunct> root 1808 0.0 0.0 0 0 pts/0 Z< 02:25 0:00 [sleep] <defunct> root 2059 0.0 0.0 0 0 pts/0 Z< 02:34 0:00 [odsNameServer] <defunct> root 2062 0.3 0.0 0 0 pts/0 Z< 02:34 0:04 [xranOamCtrl] <defunct> root 2066 0.0 0.0 0 0 pts/0 Z 02:34 0:00 [python3] <defunct> root 2083 0.0 0.0 0 0 pts/0 Z< 02:34 0:00 [pmon.sh] <defunct> root 2156 0.1 0.0 0 0 pts/0 Z 02:34 0:02 [xranUpCtrl] <defunct> root 2164 0.0 0.0 0 0 pts/0 Z< 02:34 0:01 [xranGnbCtrl] <defunct> root 2173 0.0 0.0 0 0 pts/0 Z< 02:34 0:01 [xranCellCtrl] <defunct> root 2218 0.0 0.0 0 0 pts/0 Z< 02:34 0:00 [xranProxyCtrl] <defunct> root 2225 0.2 0.0 0 0 pts/0 Z 02:34 0:03 [xranDuCtrl] <defunct> root 4608 0.0 0.0 0 0 pts/0 Z< 02:38 0:00 [sleep] <defunct> root 4869 0.0 0.0 0 0 pts/0 Z< 02:38 0:00 [odsNameServer] <defunct> root 4872 0.4 0.0 0 0 pts/0 Z< 02:38 0:05 [xranOamCtrl] <defunct> root 4876 0.0 0.0 0 0 pts/0 Z 02:38 0:00 [python3] <defunct> root 4893 0.1 0.0 0 0 pts/0 Z< 02:38 0:01 [pmon.sh] <defunct> root 4961 0.7 0.0 0 0 pts/0 Z 02:38 0:08 [xranUpCtrl] <defunct> root 4974 0.1 0.0 0 0 pts/0 Z< 02:39 0:02 [xranGnbCtrl] <defunct> root 4983 0.2 0.0 0 0 pts/0 Z< 02:39 0:02 [xranCellCtrl] <defunct> root 5028 0.0 0.0 0 0 pts/0 Z< 02:39 0:00 [xranProxyCtrl] <defunct> root 5035 1.0 0.0 0 0 pts/0 Z 02:39 0:12 [xranDuCtrl] <defunct> root 17783 0.0 0.0 0 0 pts/0 Z< 02:52 0:00 [sleep] <defunct> root 22929 0.0 0.0 5756 1704 pts/2 S+ 02:58 0:00 grep --color=auto Z [root@xran-cudu0808-0 home]# ps -eo pid,ppid,stat,cmd | grep '^[[:space:]]*[0-9]\+[[:space:]]\+[0-9]\+[[:space:]]\+Z' 293 1 Z< [odsNameServer] <defunct> 296 1 Z< [xranOamCtrl] <defunct> 300 1 Z [python3] <defunct> 317 1 Z< [pmon.sh] <defunct> 390 1 Z [xranUpCtrl] <defunct> 398 1 Z< [xranGnbCtrl] <defunct> 407 1 Z< [xranCellCtrl] <defunct> 452 1 Z< [xranProxyCtrl] <defunct> 459 1 Z [xranDuCtrl] <defunct> 1808 1 Z< [sleep] <defunct> 2059 1 Z< [odsNameServer] <defunct> 2062 1 Z< [xranOamCtrl] <defunct> 2066 1 Z [python3] <defunct> 2083 1 Z< [pmon.sh] <defunct> 2156 1 Z [xranUpCtrl] <defunct> 2164 1 Z< [xranGnbCtrl] <defunct> 2173 1 Z< [xranCellCtrl] <defunct> 2218 1 Z< [xranProxyCtrl] <defunct> 2225 1 Z [xranDuCtrl] <defunct> 4608 1 Z< [sleep] <defunct> 4869 1 Z< [odsNameServer] <defunct> 4872 1 Z< [xranOamCtrl] <defunct> 4876 1 Z [python3] <defunct> 4893 1 Z< [pmon.sh] <defunct> 4961 1 Z [xranUpCtrl] <defunct> 4974 1 Z< [xranGnbCtrl] <defunct> 4983 1 Z< [xranCellCtrl] <defunct> 5028 1 Z< [xranProxyCtrl] <defunct> 5035 1 Z [xranDuCtrl] <defunct> 17783 1 Z< [sleep] <defunct> [root@xran-cudu0808-0 home]# kill -s SIGCHLD 293 [root@xran-cudu0808-0 home]# kill -s SIGCHLD 293296 bash: kill: (293296) - No such process [root@xran-cudu0808-0 home]# kill -s SIGCHLD 296 [root@xran-cudu0808-0 home]# ps -eo pid,ppid,stat,cmd | grep '^[[:space:]]*[0-9]\+[[:space:]]\+[0-9]\+[[:space:]]\+Z' 293 1 Z< [odsNameServer] <defunct> 296 1 Z< [xranOamCtrl] <defunct> 300 1 Z [python3] <defunct> 317 1 Z< [pmon.sh] <defunct> 390 1 Z [xranUpCtrl] <defunct> 398 1 Z< [xranGnbCtrl] <defunct> 407 1 Z< [xranCellCtrl] <defunct> 452 1 Z< [xranProxyCtrl] <defunct> 459 1 Z [xranDuCtrl] <defunct> 1808 1 Z< [sleep] <defunct> 2059 1 Z< [odsNameServer] <defunct> 2062 1 Z< [xranOamCtrl] <defunct> 2066 1 Z [python3] <defunct> 2083 1 Z< [pmon.sh] <defunct> 2156 1 Z [xranUpCtrl] <defunct> 2164 1 Z< [xranGnbCtrl] <defunct> 2173 1 Z< [xranCellCtrl] <defunct> 2218 1 Z< [xranProxyCtrl] <defunct> 2225 1 Z [xranDuCtrl] <defunct> 4608 1 Z< [sleep] <defunct> 4869 1 Z< [odsNameServer] <defunct> 4872 1 Z< [xranOamCtrl] <defunct> 4876 1 Z [python3] <defunct> 4893 1 Z< [pmon.sh] <defunct> 4961 1 Z [xranUpCtrl] <defunct> 4974 1 Z< [xranGnbCtrl] <defunct> 4983 1 Z< [xranCellCtrl] <defunct> 5028 1 Z< [xranProxyCtrl] <defunct> 5035 1 Z [xranDuCtrl] <defunct> 17783 1 Z< [sleep] <defunct> [root@xran-cudu0808-0 home]#
08-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值