操作系统实践报告
- 格式:docx
- 大小:21.47 KB
- 文档页数:31
操作系统实践报告
多进程题目
: 实现shell程序,要求具备如下功能
•支持命令参数
•$ echo arg1 arg2 arg3
•$ ls /bin /usr/bin /home
•实现内置命令cd、pwd、exit
•$ cd /bin
•$ pwd
•/bin
思路:
说明:首先设置一个死循环模仿shell终端,读取用户的输入,并且根据空格将输入拆分成字符串数组,然后调用excute这个子函数进行处理。
1.echo
根据数组第一个元素来判断命令是什么,判断出是ehco后,fork一个新的进程,将其后的内容一个个输出出来,并且父进程等待子进程退出后再执行,确保输出在屏幕上时不被打断。
2.ls
3.读取用户输入并且根据拆分的数组判断出是ls命令后,fork一个新的进程,调用execlp函数将
/bin/ls下的ls程序装入子进程并将拆分的数组参数部分传递给ls即可,同样的,父进程等待子进程退出,确保输出在屏幕上不被打断。
4.cd
5.同样是根据输入并拆分成数组后判断出是cd命令后,fork一个新的进程,然后调用chdir并将
拆分数组的参数部分传递给chdir作为实参即可。
6.pwd
同样是根据输入并拆分成数组后判断出是pwd命令后,fork一个新的进程,然后调用
system("pwd")即可,此命令也可以用来验证上面的cd命令是否正确执行。
7.exit
8.根据用户输入逼格拆分的数组判断出是exit命令后,excute子函数返回-1,在循环中检测excute
的返回值,如果是-1则直接return,退出模仿的shell终端。
: 实现shell程序,要求在第1版的基础上,添加如下功能
•实现文件重定向
•$ echo hello >log
•$ cat log
•Hello
思路:
接的描述,若判断出是echo命令后,要再次判断拆分的字符串数组中有无“>”出现,如果有,则把“>”之前、echo之后的内容作为输出,把“>”之后到“>”之后的第一个空白字符作为文件名,fopen创建文件并fwrite将输出内容输出到该文件中,并关闭文件。
和的源代码:
#include <>
#include <>
#include <>
#include <>
#include
#include
#include <>
#define LEN 256
#define WIDTH 256
#define HEIGHT 10
void split(char source[],char dest[HEIGHT][WIDTH])
{
char *p;
p=strsep(&source," ");
int i=0;
for(i=0;p[i]!='\0';i++){
dest[0][i]=p[i];
}
dest[0][i]='\0';
int j=1;
while(p){
p=strsep(&source," ");
if(p){
for(i=0;p[i]!='\0';i++){
dest[j][i]=p[i];
}
dest[j][i]='\0';
j++;
}
}
}
int execute(char comm[HEIGHT][WIDTH])
{
if(strcmp(comm[0],"echo")==0){
int pid=fork();
if(pid==0){
int i=0;
int is=0;
for(i=1;comm[i][0]!='\0';i++){
if(comm[i][0]=='>'){
is=1;
break;
}
}
if(is==1){
puts(comm[i+1]);
FILE *fp=fopen(comm[i+1],"w+");
int j=0;
for(j=1;j
fseek(fp,0,SEEK_END);
fwrite(comm[j],strlen(comm[j]),1,fp);
}
fclose(fp);
}else{
int j=0;
for(j=1;comm[j][0]!='\0';j++){
printf("%s",comm[j]);
printf(" ");
}
printf("\n");
}
}else{
int status;
wait(&status);
}
}else if(strcmp(comm[0],"ls")==0){
int pid=fork();
if(pid==0){
if(comm[1][0]=='\0'){
execlp("/bin/ls","ls","./",NULL,NULL,NULL);
}else{
execlp("/bin/ls","ls",comm[1],NULL,NULL,NULL);
}
}else{
int status;
wait(&status);
}
}else if(strcmp(comm[0],"cd")==0){
int pid=fork();
if(pid==0){
chdir(comm[1]);
}else{
int status;
wait(&status);
}
}else if(strcmp(comm[0],"pwd")==0){