当没有指定查找路径时
Windows 会默认在当前路径下查找
Linux 默认在系统规定的目录(规定的目录是在PATH里边写死的)去查找,是不会在当前路径里边查找的
要想在当前目录下查找,必须把当前路径配到PATH里边去
如何将进程的空间的替换掉?------加载程序
加载器----exec系列的函数----将磁盘中的内容映射到内存中
exec系列函数的原型
int execve(const char* filename , char* const argv[] , char* const envp[]);
------操作系统只提供了这一个函数,其他的都是C语言库在它的基础上封装的。
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 ,const char* argv[]);
int execvp(const char* file,const char* argv[])
execl/execv 函数名中带p的是file ,因为那个p 就是path,代表文件路径
execlp/execvp 函数名不带p的是path,不仅要给出文件,还要给出文件里的路径。
execl ----不带e会将当前的进程的环境变量拿去用
execle ----e代表环境变量 不要原来的环境变量,要自己组装环境变量
如果既想使用execle 又想使用当前进程的环境变量,怎么实现呢?
系统里边定义了一个全局变量:char** environ
可以使用 extern char** environ ,然后通过environ访问系统的环境变量。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
extern char* environ
int main()
{
int i =0;
for(i = 0; environ[i] != NULL ;i++)
printf("%s\n",environ[i]);
if(execle("./hello","hello",NULL,environ ) == -1)
perror("exec"),exit(1);
}
这样一系列函数的使用都差不多,在这里就演示一下 execvp 的使用
为了方便验证,在这里将替换程序写简单一点。
被替换的程序

从结果可以看出,exec.c里边的 after execvp 并没有输出,这是为什么呢?
因为execvp函数已经使用可执行程序hello将后边的内容替换掉了。
如果替换失败,返回-1,后续代码依然会继续执行
exec系列函数
注:在哪个进程里边调用了exec就替换哪个进程的空间,并不需要创建一个子进程。
exec系列函数执行失败返回-1,原空间里边的内容会继续执行
执行成功地话是不会返回的,因为原来的空间已经被替换掉了,返回也没地接收了,所以不返回。
执行成功是不会返回的,因为执行成功了的话,原来的代码都不存在了,返回值也没地接收了,所以不返回。