欢迎来到天天文库
浏览记录
ID:24048226
大小:147.50 KB
页数:3页
时间:2018-11-12
《实验一实现带参数简单shell》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验一实现带参数的简单shell实验要求:利用课本第9页程序1-5的框架,实现允许输入命令带参数的简单shell。原来的实现是不能够带参数的。输入命令所能带的参数个数,只受到系统键盘输入缓冲区长度(以及shell输入缓冲区长度)的限制,该缓冲区的缺省长度是4096个字节。实现时要解决的主要问题有:1、正确理解并使用系统调用fork(),execve()和waitpid(),特别是execve()函数。2、根据简单shell的输入,构造execve函数的参数。设计思路:execve函数原型:intexecve(constchar*path,constchar*a
2、rgv[],constchar*envp[]);其中:path:要执行的程序路径名,比如“/bin/ls”,“cd”,“/usr/bin/gcc”等等。argv:参数表,比如ls命令中可带的命令行参数-l,-a等。注意,argv的第一个元素必须是要执行的程序(命令)的路径名。envp:环境变量表,供要执行的命令使用。实参数用NULL或系统环境变量environ。因此构建二维数组str[10][10],输入的指令以空格为分隔标志,分别将字符串存入str[i++];最后将str[0]赋给path,str[i]赋给argv[i],运行execve函数即可。详细代码:
3、intmain(void){charbuf[MAXLINE];/*fromapue.h*/char*envp[]={"",NULL};char*argv[]={NULL};charstr[10][10];inti,j,k;pid_tpid;intstatus;printf("%%");/*printprompt(printfrequires%%toprint%)*/while(fgets(buf,MAXLINE,stdin)!=NULL){if(buf[strlen(buf)-1]=='')buf[strlen(buf)-1]=0;/*replacenew
4、linewithnull*/i=j=k=0;while(buf[j]!=' '){if(buf[j]!=''){for(i=j;buf[i]!=''&&buf[j]!=' ';i++)str[k][i-j]=buf[i];str[k][i-j]=' ';k++;j=i;}elsej++;}for(i=0;i5、err_ret("couldn'texecute:%s",argv[0]);exit(127);}/*parent*/if((pid=waitpid(pid,&status,0))<0)err_sys("waitpiderror");printf("%%");}exit(0);}运行结果:心得体会:初次接触UNIX环境编程,通过学习相关指令,已经能够进行UNIX下的基本操作,有种学习计算机的优越感。每次实验内容不仅提高了我们的编程能力,而且提高了我们解决问题的能力。完成人姓名:魏陈强学号:23020092204168谢思发学号:23020092204174完成6、时间:2011年10月12号。
5、err_ret("couldn'texecute:%s",argv[0]);exit(127);}/*parent*/if((pid=waitpid(pid,&status,0))<0)err_sys("waitpiderror");printf("%%");}exit(0);}运行结果:心得体会:初次接触UNIX环境编程,通过学习相关指令,已经能够进行UNIX下的基本操作,有种学习计算机的优越感。每次实验内容不仅提高了我们的编程能力,而且提高了我们解决问题的能力。完成人姓名:魏陈强学号:23020092204168谢思发学号:23020092204174完成
6、时间:2011年10月12号。
此文档下载收益归作者所有