目录
一.替换原理
用
fork
创建子进程后执行的是和父进程相同的程序
(
但有可能执行不同的代码分支
),
子进程可以用过要调用一种
exec
函数去执行另一个程序。当进程调用一种exec
函数时
,
该进程的用户空间代码和数据完全被新程序替换
,
从新程序的启动例程开始执行。
调用
exec
并不创建新进程
,
所以调用
exec
前后该进程的id没有改变。
二.替换函数
一共有6中替换函数 ,统称为exec函数。
#include <unistd.h>`
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 cha *file,char *const argv[]);
这些函数如果调用成功,则会加载新的程序从启动代码处开始执行。如果调用失败了会返回-1。
要执行一个全新的程序,首先要找到该程序的位置,以及怎么去执行,可以认为这些就是参数。
举例子看一下:
1.execl:第一个参数是执行参数的路径,第二个参数是可变参数列表,表示你如何执行这个程序,并以NULL结尾。
int main()
{
pid_t id=fork();
if(id==0)
{
printf("我是子进程,我的id=%d\n",getpid());
execl("/usr/bin/ls","ls","-a","-l",NULL);
//execl("./T","T",NULL); //也可运行自己写的程序
printf("我已经执行完毕\n");
}
else
{
int status=0;
int ret=waitpid(id,&status,0);
sleep(2);
if(ret>0)
{
printf("退出信号是%d,退出码是%d\n",(status>>8)&0xFF,status&0xFF);
printf("等待成功\n");
}
}
return 0;
}
[LF@ecs-100710 lesson7]$ ./t