操作系统实践报告.docx
《操作系统实践报告.docx》由会员分享,可在线阅读,更多相关《操作系统实践报告.docx(42页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上操作系统实践报告多进程题目sh1.c: 实现shell程序,要求具备如下功能 支持命令参数 $ echo arg1 arg2 arg3 $ ls /bin /usr/bin /home 实现内置命令cd、pwd、exit $ cd /bin $ pwd /bin思路:说明:首先设置一个死循环模仿shell终端,读取用户的输入,并且根据空格将输入拆分成字符串数组,然后调用excute这个子函数进行处理。1. echo根据数组第一个元素来判断命令是什么,判断出是ehco后,fork一个新的进程,将其后的内容一个个输出出来,并且父进程等待子进程退出后再执行,确保输出在屏幕上
2、时不被打断。2. ls读取用户输入并且根据拆分的数组判断出是ls命令后,fork一个新的进程,调用execlp函数将/bin/ls下的ls程序装入子进程并将拆分的数组参数部分传递给ls即可,同样的,父进程等待子进程退出,确保输出在屏幕上不被打断。3. cd同样是根据输入并拆分成数组后判断出是cd命令后,fork一个新的进程,然后调用chdir并将拆分数组的参数部分传递给chdir作为实参即可。4. pwd同样是根据输入并拆分成数组后判断出是pwd命令后,fork一个新的进程,然后调用system(pwd)即可,此命令也可以用来验证上面的cd命令是否正确执行。5. exit根据用户输入逼格拆分的
3、数组判断出是exit命令后,excute子函数返回-1,在循环中检测excute的返回值,如果是-1则直接return,退出模仿的shell终端。sh2.c: 实现shell程序,要求在第1版的基础上,添加如下功能 实现文件重定向 $ echo hello log $ cat log Hello思路: 接sh1.c的描述,若判断出是echo命令后,要再次判断拆分的字符串数组中有无“”出现,如果 有,则把“”之前、echo之后的内容作为输出,把“”之后到“”之后的第一个空白字符作为文件名,fopen创建文件并fwrite将输出内容输出到该文件中,并关闭文件。sh1.c和sh2.c的源代码:#in
4、clude #include #include #include #include #include #include #define LEN 256#define WIDTH 256#define HEIGHT 10void split(char source,char destHEIGHTWIDTH)char *p;p=strsep(&source, );int i=0;for(i=0;pi!=0;i+)dest0i=pi;dest0i=0;int j=1;while(p)p=strsep(&source, );if(p)for(i=0;pi!=0;i+)destji=pi;destji=
5、0;j+;int execute(char commHEIGHTWIDTH)if(strcmp(comm0,echo)=0)int pid=fork();if(pid=0)int i=0;int is=0;for(i=1;commi0!=0;i+)if(commi0=)is=1;break;if(is=1)puts(commi+1);FILE *fp=fopen(commi+1,w+);int j=0;for(j=1;j);gets(command);split(command,splitArray);int i=0;if(-1=execute(splitArray)return 0;sh3.
6、c: 实现shell程序,要求在第2版的基础上,添加如下功能 实现管道 $ cat /etc/passwd | wc -l 实现管道和文件重定向 $ cat input.txt 3 2 1 3 2 1 $ cat output.txt $ cat output.txt 1 2 3思路:首先读取用户输入,以“|”为分隔符将输入分割成字符串数组,然后在一个while循环中依次执行下面的动作:代码中通过pipe()函数来创建管道,创建之后父进程和子进程一个只能向管道写内容,一个只能向管道读内容。然后利用dup()函数来把进程的输入流或者输出流重定向到管道里,这样就能实现管道的操作。实现的时候注意可以
7、使用多个“|”来迭代进行管道操作,需要使用一个循环来处理。用system执行每一条命令,同时还要注意最后一个操作的输出流是标准输出(即屏幕),不需要重定向到管道里,需要特殊处理一下。源代码:#include #include #include #include #include #include #include #define LEN 256#define WIDTH 256#define HEIGHT 10void split(char source,char destHEIGHTWIDTH)char *p;p=strsep(&source,|);int i=0;for(i=0;pi!=0
8、;i+)dest0i=pi;dest0i=0;int j=1;while(p)p=strsep(&source,|);if(p)for(i=0;pi!=0;i+)destji=pi;destji=0;j+;main()char commandLEN;char splitArrayHEIGHTWIDTH=0;printf(%s,);gets(command); split(command,splitArray); int i=0; for(i=0;splitArrayi0!=0;i+) puts(splitArrayi); int p2; pipe(p); int j=0; for(j=0;sp
9、litArrayj+10!=0;j+) if (fork() = 0) / Child process close(0); close(p0) close(p1); dup(p0); system(splitArrayj); else /Parent process close(1); close(p0) close(p1); dup(p1); system(splitArrayj+1); 多线程题目pi1.c: 使用2个线程根据莱布尼兹级数计算PI 莱布尼兹级数公式: 1 - 1/3 + 1/5 - 1/7 + 1/9 - . = PI/4 主线程创建1个辅助线程 主线程计算级数的前半部分
10、辅助线程计算级数的后半部分 主线程等待辅助线程运行結束后,将前半部分和后半部分相加思路:计算公式前1000项,主线程计算前5000项,子线程计算后5000项,主进程等待子进程结束,通过pthread_join(sub,(void *)&result);的result参数获取子进程计算结果再相加即可。源代码:#include#include#include#include#define LEN 10000 struct result float sum;void *subThread() int i; float j; struct result *result; float sum1=0,su
11、m2=0,sum=0; for(i=LEN/2+1;isum=sum; return result;int main() int i; float j; float sum1=0,sum2=0,sum=0; for(i=1;isum; printf(%fn,sum); return 0; pi2.c: 使用N个线程根据莱布尼兹级数计算PI 与上一题类似,但本题更加通用化,能适应N个核心,需要使用线程参数来实现 主线程创建N个辅助线程 每个辅助线程计算一部分任务,并将结果返回 主线程等待N个辅助线程运行结束,将所有辅助线程的结果累加思路:设计算公式前1000项,读取用户输入的线程数目N,通过pt
12、hread_create(&workersi-1,NULL,compute,myparam);产生N个线程,并且通过myparam设置每一个线程计算的起始项和终止项,通过pthread_join(workersj,(void *)&myresult);等待每个线程结束并通过result获取结果,将结果相加即可。源代码:#include#include#include#include#define LEN 10000#define MAX_WORKERS 100struct param int start; int end;struct result float sum;void *comput
13、e(void *arg) int i; float j; struct param *myparam; myparam=(struct param *)arg; int start=myparam-start; int end=myparam-end; struct result *myresult; float sum1=0,sum2=0,sum3=0; for(i=start;isum=sum2-sum1; return myresult;int main() int thread_num=1; struct param myparamsMAX_WORKERS+1; pthread_t w
14、orkersMAX_WORKERS; printf(please input thread number:); scanf(%d,&thread_num); int i; myparams0.start=0; myparams0.end=0; for(i=1;istart=myparamsi-1.end+1; myparam-end=myparamsi.start+(LEN/thread_num)-1; pthread_create(&workersi-1,NULL,compute,myparam); myparamsthread_num.start=myparamsthread_num-1.
15、end+1; myparamsthread_num.end=LEN; pthread_create(&workersthread_num-1,NULL,compute,&myparamsthread_num); int j; float sum=0; for(j=0;jsum; free(myresult); printf(%fn,sum); return 0;sort.c: 多线程排序 主线程创建一个辅助线程 主线程使用选择排序算法对数组的前半部分排序 辅助线程使用选择排序算法对数组的后半部分排序 主线程等待辅助线程运行結束后,使用归并排序算法归并数组的前半部分和后半部分思路:主线程排序数组
16、的前半部分,辅助线程排序后半部分,pthread_create(&worker_id,NULL,&sort,&pa);中pa传递的是数组的首地址,主线程等辅助线程结束后,再调用merge将数组合并为有序。源代码:#include#include#include#include#define LEN 10int arrayLEN=0,3,8,6,2,9,5,4,1,7;struct param int *arr;void *sort(void *arg) struct param *mypa; mypa=(struct param *)arg; int i=0; int j=0; int min
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实践 报告
限制150内