Linux 进程 之 替换

Linux 中,进程控制有四种状态:创建退出等待替换

本篇博客讲述 替换 状态下的一些事:

程序替换:替换一个进程正在调度运行的程序。替换之后,程序是从头重新运行,加载一个新的程序到内存中,更新当前进程的页表映射信息到新的程序上。

程序替换是在当前进程pcb并不退出的情况下,替换当前进程正在运行的程序为新的程序,即
1、程序替换成功后,运行完新程序,依然会运行原有的代码
2、程序替换成功后,原进程没有退出,使用原进程运行新程序
如:
vivim 编辑器下,在文件的底行输入:12s/argv/environ/g ,即将12行的argv全部替换为environ,该程序中的g代表全部

exec函数族:5个库函数 + 系统调用接口(其实是6个库函数,但最后一个基本不怎么用
:该函数族中的函数使用时,均需包含头文件 unistd.h ,即 #include <unistd.h>

5个库函数:(除了带p的,其他的函数都得给路径)

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 char *file, char *const argv[]);
// int execvpe(const char *file, char *const argv[], char *const envp[]);

系统调用接口

int execve(const char *path, char *const argv[], char *const envp[]);

上述函数,总体有三类参数:(参数总是以NULL结尾)
(1)新的程序路径名称:path(需要带路径)或 file(可以直接为文件名)
(2)程序运行参数:argargv
(3)自己设定环境变量(上述函数中最后一个字母为e的,需要自设环境变量;其他函数是调用系统自身的环境变量)

注意:参数是以NULL结尾,在NULL之后才是其他

1、execlexecv 的区别:程序运行参数的不同设置方式(execl是参数一个一个给,execv是所有参数用指针直接给),如:

execl("/bin/ls","ls","-a","-l",NULL);//参数的给与,首先是它自己,其次是与其相关的,且是以NULL结尾
char *argv[]={"ls","-a","-l",NULL};execv("/bin/ls",argv);

2、execlexeclp 的区别:新的程序是否需要带路径(execl需要带路径,execlp不需要带),如:

execl("/bin/ls",...);
execlp("ls",...);

不用带路径的前提是:会到PATH环境变量指定的路径下去找对应程序,如果该指定路径下无对应路径,则程序就会出错,或自己指定路径也可以

3、excelexecle 的区别:环境变量是否由自己来设置,如何退出进程

execl("/bin/ls",...); // 使用默认当前就有的环境变量
char *env[]={"MYVAL=1000",NULL}; execle("/bin/ls",...,NULL,env); // 使用自设的环境变量

为验证以上函数的使用,给出几个例子:
注:下列程序中 myenv 是一个输出 上述函数族中函数对应的 程序运行参数所设定变量 的执行文件。

例1:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

int main()
{
    printf("进行程序替换!!\n");
   // execl("/usr/bin/ls","ls","-a","-l",NULL);//当该语句运行完后,程序就会开始运行ls,而非继续往下运行原程序
    
	//该语句和上行程序作用一致
	//char *arg[]={"ls","-a","-l",NULL};
   // execv("/usr/bin/ls",arg);
	
	char *arg[]={"ls","-a","-l",NULL};
    //execvp("ls",arg); // 不需要带路径
	execvp("./myenv",arg);//如果所替换程序未在PATH指定路径下,可以直接自定义路径

	printf("程序替换完毕!!\n");
    return 0;
}

如果程序最后输出  程序替换完毕!!  则说明程序替换未成功,即该程序未实现目标功能

例2

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

int main()
{
    printf("进行程序替换!!\n");
    
    char *arg[]={"ls","-a","-l",NULL};
    char *env[]={"MYVAL=1000",NULL};//自设环境变量
    execve("./myenv",arg,env);

    printf("程序替换完毕!!\n");
    return 0;
}

运行结果为:

进行程序替换!!
argv[0]=ls
argv[1]=-a
argv[2]=-l
environ[0]=MYVAL=1000

例3

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

int main()
{
    printf("进行程序替换!!\n");
    
    char *arg[]={"ls","-a","-l",NULL};
    char *env[]={"MYVAL=1000",NULL};//自设环境变量
 
    execle("./myenv","myenv","-a","-l",NULL,env);

    printf("程序替换完毕!!\n");
    return 0;
}

运行结果为:

进行程序替换!!
argv[0]=myenv
argv[1]=-a
argv[2]=-l
environ[0]=MYVAL=1000
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值