《山大操作系统实验-1(4页).doc》由会员分享,可在线阅读,更多相关《山大操作系统实验-1(4页).doc(4页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-山大操作系统实验-1-第 4 页操作系统原理实验报告 实验一张咪 软件工程四班一、 实验目的 加深对于进程并发执行概念的理解。实践并发进/线程的创建和控制方法。观察和体验进程的动态特性。进一步理解进程生命期期间创建、变换、撤销状态变换的过程。掌握进程控制的方法,了解父子进程间的控制和协作关系。练习Linux系统中进/线程创建与控制有关的系统调用的编程和调试技术。二、 实验要求编写一个多进程并发执行程序。父进程每隔3秒重复建立两个子进程,首先创建的让其执行ls命令,之后创建执行让其执行ps命令,并控制ps命令总在ls命令之前执行。三、实验软硬件环境实验环境均为Linux操作系统,开发工具为gc
2、c和g+。四、实验思路调用fock()创建子进程。创建键盘中断信号后,使用pause()可以暂停子进程执行,继续创建新的子进程。子进程并发执行子进程可以首先通过键盘中断信号唤醒子进程。通过exec()调用族装入一个新的执行程序。在建立子进程2并且唤醒子进程1后子进程sleep(seconds = 5)。这样就可以先执行ps后执行ls。最后就是父进程的结束,程序结束。五、实验模型 pid1=fork()pid1=0子进程1执行ps指令pid10父进程pid2=fork()pid10父进程每隔三秒重复建立两个子进程pid20错误六、调试排错1、首先遇到的问题是,对linux的操作不熟悉,不太明白m
3、akefile怎么使用,直接用了gcc2、在创建多个子进程上遇到了问题,在fock()后又直接跟了一个fork(),这样创建的子进程是子进程的子进程,而不是父进程创建的第二个子进程。所以应该在else语句块后面,也就是主进程执行段继续创建。一般情况下,fork()按如下规则编程:main() pid_t pid; pid=fork(); if(pid0) / 建立子进程失败 printf(Create Process fail!n); exit(EXIT_FAILURE); if (pid = = 0) /子进程代码; /如果需要创建子进程,可以按该方法嵌套 else /父进程代码 /如果需要
4、创建子进程,可以按该方法嵌套3、后来父进程与子进程无法重复建立,执行一次就结束了,又加了一个while循环实现重复建立,但无法退出,一直执行。又加了一个count计数变量,执行五次后停止。七、实验结果父进程首先创建了子进程a,子进程1暂停。父进程继续创建子进程b。子进程b唤醒了子进程a,子进程a进入sleep()。子进程2执行ps退出,子进程1执行ls。循环五次退出。八、代码#includepro.hintmain(intargc,char*argv)inti;intpid1,pid2;intstatus1,status2;char*args1=/bin/ls,-a,NULL;char*arg
5、s2=/bin/ps,-a,NULL;signal(SIGINT,(sighandler_t)sigcat);int count=0;while(count5) if(pid1=fork()=0) pause(); printf(%dThisischild1runningn,getpid(); status1=execve(args10,args1,NULL); else pid2=fork(); if(pid2=0) waitpid(pid2,&status2,0); sleep(3); printf(%dFather:Child2finnishedn,getpid();count+; if(kill(pid1,SIGINT)=0) waitpid(pid1,&status1,0); printf(%dFather:Child1finished.n,getpid();return(EXIT_SUCCESS);#include#include#include#include#include#includetypedef void(*sighandler_t)(int);void sigcat()printf(Process continuen);