进程替换

进程替换

fork生成的子进程和父进程的功能一样,如果想让fork生成的子进程的功能不一样,即拥有与父进程不一样的代码段数据段以及堆栈段,应该怎么办呢
使用exec函数系列

fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法

所需头文件: #include <unistd.h>
函数说明: 执行文件
函数原型:
int execl(const char *path, const char *arg, …)
int execv(const char *path, char *const argv[])
int execle(const char *path, const char *arg, …, char *const envp[])
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、带l的exec函数:execl,execlp,execle,表示后边的参数以可变参数的形式给出且都以一个空指针结束。

execl("/bin/ls",“ls”,"-l",NULL)
在这里插入图片描述

案例:execl1.c

#通过execl调用test1
test1.c
在这里插入图片描述
在这里插入图片描述
#查看命令路径
which ls在这里插入图片描述
2、带p的exec函数:execlp,execvp,表示第一个参数path不用输入完整路径,只有给出命令名即可,它会在环境变量PATH当中查找命令
示例:
当不带p但没给出完整路径时:

#第一个参数是命令的完成路径,如果只写了命令,系统会在环境变量的路径中查找命令
#查看环境变量 echo $PATH
在这里插入图片描述
excep(“ls”,“ls”,"-l",NULL)
例如 execl2.c
在这里插入图片描述
运行结果为:
在这里插入图片描述

案例
execl3.C
在这里插入图片描述
运行结果为:
在这里插入图片描述
3、不带 l 的exec函数:execv,execvp表示命令所需的参数以char *arg[]形式给出且arg最后一个元素必须是NULL

4、带 e 的exec函数:execle表示,将环境变量传递给需要替换的进程
从上述的函数原型中我们发现:
extern char **environ;
此处的environ是一个指针数组,它当中的每一个指针指向的char为“XXX=XXX”
environ保存环境信息的数据可以env命令查看:

fcntl_exec.c

//如果FD_CLOEXEC标识位为0,则通过execve调用后fd依然是打开的,否则为关闭的
在这里插入图片描述
运行结果为:
在这里插入图片描述

exec调用举例如下:
char *const ps_argv[] = { “ps”, “-o”, “pid,ppid,pgrp,session,tpgid,comm”, NULL };
char *const ps_envp[] = { “PATH=/bin:/usr/bin”, “TERM=console”, NULL };
execl("/bin/ps", “ps”, “-o”, “pid,ppid,pgrp,session,tpgid,comm”, NULL);
execv("/bin/ps", ps_argv);
execle("/bin/ps", “ps”, “-o”, “pid,ppid,pgrp,session,tpgid,comm”, NULL, ps_envp);
execve("/bin/ps", ps_argv, ps_envp);
execlp(“ps”, “ps”, “-o”, “pid,ppid,pgrp,session,tpgid,comm”, NULL);
execvp(“ps”, ps_argv);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值