一个程序如何运行另一个程序 答案:调用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没有返回值,当前程序从进程中清除,新的程序在当前进程中运行