实现自己的shell(一)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值