操作系统实践报告

  • 格式:docx
  • 大小:21.47 KB
  • 文档页数:31

下载文档原格式

  / 31
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统实践报告

多进程题目

: 实现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){