一个程序如何运行另一个程序
答案:调用execvp
图8.6显示了一个程序如何运行另一个程序。比如,为了运行ls -la,一个程序调用execvp(“ls”,arglist)。这里arglist是命令行的字符串数组。内核从磁盘将程序载入内存。命令参数ls -la被传给程序,然后程序开始运行。简而言之:
(1)程序调用execvp
(2)内核从磁盘将程序载入
(3)内核将arglist复制到进程
(4)内核调用main(argc,argv)
下面是运行ls -l的完整程序:
main() {
char* argclist[3];
argclist[0] = "ls";
argclist[1] = "-l";
argclist[2] = 0;
printf("***about to exec ls -l\n");
execvp("ls", argclist);
printf("*** ls is done\n");
}
execvp有两个参数:要运行的程序名和那个程序的命令行参数数组。当程序运行时命令行参数以argv[]传给程序。注意将数组的第一个元素置为程序的名称。还要注意,最后一个元素必须是null。
1.第二条打印的消息哪里去了
再看一下代码。程序宣布它要运行ls程序,运行ls程序,然后宣布ls结束。那么第二条信息呢?
一个程序在一个进程中运行——也就是一些内存和内核中相应的数据结构,这样,execvp将程序从磁盘载入进程一遍他可以被运行,但是载入到哪个进程呢,这就是问题之所在,内核将新程序载入到当前进程,替代当前进程的代码和数据。
2.execvp就像换脑
有人可能会有这样的愿望:“我希望用爱因斯坦的脑子解决这个问题,然后再用自己的脑子做其他的事。”一种实现这个愿望的方法事拿掉你的大脑,然后装上爱因斯坦的大脑,这样你就拥有了他的思考和分析能力。这样想拥有两个思维的愿望就和原来的大脑一起被拿掉了。
exec系统调用从当前进程中吧当前程序的机器指令清楚,然后在空的进程中载入调用事指定的程序代码,最后运行这个新的程序,exec调整进程的内存分配使之适应信的程序对内存的要求。相同的进程,不同的内容
execvp()总结如下
execvp | |
---|---|
目标 | 在指定路径中查找并执行一个文件 |
头文件 | #include<unistd.h> |
函数原型 | result = execvp(const char* file, const char* argv[]) |
参数 | file 要执行的文件名 argv字符串数组 |
返回值 | -1 如果出错 |
execvp载入由file指定的程序到当前进程,然后试图运行它,execvp将以null结尾的字符串列表传给程序,execvp在环境变量PATH所知的那个的路径中查找file文件。
如果执行成功,execvp没有返回值,当前程序从进程中清除,新的程序在当前进程中运行