实验一unix实现带参数的简单shell

实验一unix实现带参数的简单shell

ID:28056715

大小:119.35 KB

页数:5页

时间:2018-12-07

实验一unix实现带参数的简单shell_第1页
实验一unix实现带参数的简单shell_第2页
实验一unix实现带参数的简单shell_第3页
实验一unix实现带参数的简单shell_第4页
实验一unix实现带参数的简单shell_第5页
资源描述:

《实验一unix实现带参数的简单shell》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、实验一实现带参数的简单shell一.实验要求利用课本第9页程序1-5的框架,实现带参数的简单shell,实现允许输入命令带参数的简单shell。(1)正确理解并使用系统调用fork(),execve()和waitpid(),特别是execve()函数。fork()函数创建一个新的进程。新进程就是所谓的子进程,它是执行fork()函数的进程(父进程)的“克隆”,也就是说,子进程执行的程序与父进程的完全一样。当fork()函数返回值为0吋表示处于子进程中;而返回值大于0时表示处于父进程中,此时的返回值是子进程的进程id。因此,fork()的返回值可以用来划分仅仅适合父进程和子进程执行的程序段

2、。fork()函数返回值为-1时表示出错。如果子进程只是运行与父进程完全一样的程序,那用处是很有限的。要让子进程运行不同于父进程的程序,就必须调用execve函数,它是所有其他exec函数的基础。execve函数把调用它的进程的程序,替换成execve函数的参数所指定的程序。运行execve函数成功后,进程将开始运行新的程序,也就是execve函数的参数所指定的程序。execve函数原型:intexecve(constchar*path,constchar*argv[],constchar*envp[]);其中:path:要执行的程序路径名,比如“/bin/ls”,“cd”,“/usr/

3、bin/gcc”等等。argv:参数表,比如Is命令中带的命令行参数-l,-a等。注意,argv的第一个元素必须是要执行的程序(命令)的路径名。envp:环境变:W:表,供要执行的命令使用。实参数用NULL或系统环境变:W:environ均可。注意,因为environ由系统提供,属于外部变量,所以说明时必须用“extern”修饰。例子:char*argv[]={“gcc”,“-g”,“-c”,“hello.c”,NULL};char*argv1[]={“/bin/ls”,“-I”,“-a”,NULL};execve(“/usr/bin/gcc”,argv,environ);//编译程序“

4、hello.c”execve(“/bin/ls”,argv1,NULL);//执行命令“Is-I-a”execve(“/usr/ls”,argvl,NULL);//出错,因力目彔/usr/下没有Is程序。//注意,在argvl的第一个字符串“/bin/ls”中,只有Is是有用的。系统调用waitpidG用于等待子进程结束、获取子进程的运行状态,详细说明在第八章。木实验仅仅用它使父进程等待子进程结束,因此维持程序1-5的用法即可。(2)根据简单shell的输入,构造execve函数的参数。根据程序1-5,数组buf保存用户的输入,包括命令和参数。由于shell命令的命令名和各参数之间是用空

5、格分开,因此可以用空格作为分界符。通过一个循环川‘以把buf数组中的命令和各个参数依次分离开来,并赋给数组argv的各元素沾当的指针值。argv数组的最后一个指针必须是NULL。接着就可以调用execve(argv[O],argv,environ)来执行用P输入的命令。提示:argv数组中各指针所指向的字符串,可以直接利用buf的存储空间,不需要另外分配内存。一.设计和实现的主要原理、构思、算法include"apue.h”#include#include#include#include#include

6、tring.h>#defineMAXLINE80intmain(){charbuf[MAXLINE];//输入行的缓存pidjpid;char*envp[]={NULL};char*argv[]={NULL};//存储命令的数组指针charstr[1024][256];//二维数纟II用来分离输入行命令和参数charpath[256];//存储路径的数组inti,j,k,status;while(fgets(buf,MAXLINE,stdin)!=NULL){memset(path,0,sizeof(path));//路径数组初始化if(buf[strlen(buf)-1]=='')

7、buf[strlen(buf)-1]=0;j=i=k=0;while(bunj]!=’*)//判断输入行是否结束{if(buf[j]!=,’)//判断当前命令或参数是否结束,进入下一个{for(i=j;buf[i]!=,&&buf[i]!=',;i++){str[k][i-j]=buf[i];//将一个完整的命令或参数放入一个行不变的二维数组屮}str[k][i-j>’7/存储完一个完整的命令或参数时,加上’’来表示

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。