操作系统实验报告三.doc_第1页
操作系统实验报告三.doc_第2页
操作系统实验报告三.doc_第3页
操作系统实验报告三.doc_第4页
操作系统实验报告三.doc_第5页
免费预览已结束,剩余10页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

浙江大学城市学院实验报告课程名称 操作系统原理实验 实验项目名称 实验三 进程的创建和简单控制 学生姓名 单健 专业班级 计算0901 学号 30901110 实验成绩 指导老师(签名 ) 日期 注意:l 务请保存好各自的源代码,已备后用。l 完成本实验后,将实验项目文件和实验报告,压缩为rar文件,上传ftp。如没有个人文件夹,请按学号_姓名格式建立。ftp:/huommupload:12345622:2007/uploadl 文件名为:学号_日期_实验XX,如30801001_20100305_实验01一. 实验目的和要求1. 掌握进程的概念和进程的状态,对进程有感性的认识;2. 掌握进程创建方法;3. 认识进程的并发执行,了解进程族之间各种标识及其存在的关系;4. 熟悉进程的创建、阻塞、唤醒、撤销等控制方法。二、实验内容1. 了解有关Linux进程的属性和进程的层次结构;2. 学习有关Linux的前台和后台进程;3. 学习有关Linux命令的顺序执行和并发执行;4. 学习有关挂起和终止进程;5. 了解并发程序的不可确定性,进行简单并发程序设计。三、实验步骤(一)Shell下的进程控制1、用ps查看进程。查看ps命令的帮助文件,尝试不同的参数,并观察结果,记录截图。rootwww # ps PID TTY TIME CMD 5855 pts/0 00:00:00 bash 5872 pts/0 00:00:00 psrootwww # ps -A PID TTY TIME CMD 1 ? 00:00:01 init 2 ? 00:00:00 migration/0 3 ? 00:00:00 ksoftirqd/0 4 ? 00:00:00 watchdog/0 5 ? 00:00:00 events/0 6 ? 00:00:00 khelper7 ? 00:00:00 kthread。rootwww # ps -w PID TTY TIME CMD 6006 pts/0 00:00:00 bash 6262 pts/0 00:00:00 psrootwww # ps -auWarning: bad syntax, perhaps a bogus -? See /usr/share/doc/procps-3.2.7/FAQUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 4024 0.0 0.0 1676 440 tty2 Ss+ 18:30 0:00 /sbin/mingetty tty2root 4025 0.0 0.0 1676 440 tty3 Ss+ 18:30 0:00 /sbin/mingetty tty3。rootwww # ps -auxWarning: bad syntax, perhaps a bogus -? See /usr/share/doc/procps-3.2.7/FAQUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.1 2088 644 ? Ss 18:28 0:01 init 3 root 2 0.0 0.0 0 0 ? S 18:28 0:00 migration/0。2、kill命令使用。截图说明。rootwww # kill -1 4294原进程root 4290 0.0 1.3 49604 6144 ? Ssl 18:31 0:00 /usr/lib/scim-1.0/scim-panel-gtk -display :0.0 -c socket -d -no-stayroot 4292 0.0 0.2 13568 1016 ? Ss 18:31 0:00 /usr/lib/scim-1.0/scim-launcher -d -c socket -e socket -f x11root 4294 0.0 5.1 42472 22988 ? S 18:31 0:00 /usr/bin/python -E /usr/bin/sealert -sroot 4295 0.0 0.5 18224 2448 ? Sl 18:31 0:00 ./escd -key_Inserted=/usr/bin/esc -on_Signal=/usr/bin/escrkill进程号为4294的进程root 4284 0.0 1.0 15440 4620 ? Ss 18:31 0:00 pam-panel-iconroot 4290 0.0 1.3 49604 6144 ? Ssl 18:31 0:00 /usr/lib/scim-1root 4292 0.0 0.2 13568 1016 ? Ss 18:31 0:00 /usr/lib/scim-1root 4295 0.0 0.5 18224 2448 ? Sl 18:31 0:00 ./escd -key_Inr3、pstree命令使用。截图说明。rootwww # pstreeinitacpid anacronrun-partsawk makewhatis.cronmakewhatis2*makewhatis atd auditdaudispdaudispd auditd automount4*automount。(二)Linux简单进程编程每个步骤请运行程序、截图,并解释运行结果,回答实验指导书的问题。1、1. 理解系统调用fork()的使用。a) fork()会产生一个与父程序相同的子程序,唯一不同之处在于其进程号,如图 1所示。图 1 系统调用fork()b) 编辑下面的程序,要求实现父进程产生两个子进程,父进程显示字符“a”、两个子进程,分别显示字符“b”、“c” ,如Error! Reference source not found.所示。rootwww 代码# gcc -o fork1 fork1.crootwww 代码# cat fork1.c#include #include #include main( ) int p1,p2; while (p1=fork()=-1); /*父进程创建第一个进程,直到成功*/ if(p1=0) /*0返回给子进程 1*/ putchar(b);/*P1的处理过程*/ else /*正数返回给父进程(子进程号)*/ while (p2=fork()=-1); /*父进程创建第二个进程,直到成功*/ if(p2=0) /*0返回给子进程2*/ putchar(c);/*P2的处理过程*/ else putchar(a);/*P2创建完成后,父进程的处理过程*/ rootwww 代码# ./fork1bcarootwww 代码#删除语句1fork函数启动一个新的进程,前面我们说过,这个进程几乎是当前进程的一个拷贝:子进程和父进程使用相同的代码段;子进程复制父进程的堆栈段和数据段。这样,父进程的所有数据都可以留给子进程,但是,子进程一旦开始运行,虽然它继承了父进程的一切数据,但实际上数据却已经分开,相互之间不再有影响了,也就是说,它们之间不再共享任何数据了。它们再要交互信息时,只有通过进程间通信来实现,这将是我们下面的内容。既然它们如此相象,系统如何来区分它们呢?这是由函数的返回值来决定的。对于父进程, fork函数返回了子程序的进程号,而对于子程序,fork函数则返回零。在操作系统中,我们用ps函数就可以看到不同的进程号,对父进程而言,它的进程号是由比它更低层的系统调用赋予的,而对于子进程而言,它的进程号即是fork函数对父进程的返回值。在程序设计中,父进程和子进程都要调用函数fork()下面的代码,而我们就是利用fork()函数对父子进程的不同返回值用if.else.语句来实现让父子进程完成不同的功能,正如我们上面举的例子一样。我们看到,上面例子执行时两条信息是交互无规则的打印出来的,这是父子进程独立执行的结果,虽然我们的代码似乎和串行的代码没有什么区别。2、思考:i. 编译连接通过后,多次运行程序,观察进程并发执行结果:ii. 如果多次运行输出内容没有变化,请分析原因。 iii.并改写原程序,延长每个进程的执行时间,再次观察运行情况。rootwww 代码# cat fork2.c#includeint main( ) int p1,p2; while (p1=fork()= -1); /*父进程创建第一个进程,直到成功*/ if(p1=0) /*0返回给子进程 1*/ /sleep(1); printf(boyn); /*P1的处理过程*/ else /*正数返回给父进程(子进程号)*/ while (p2=fork()=-1); /*父进程创建第二个进程,直到成功*/ if(p2 = 0) /*0返回给子进程2*/ /sleep(1); printf(daughtern); /*P2的处理过程*/ else /sleep(2); printf(parentn); /*P2创建完成后,父进程的处理过程*/ rootwww 代码# gcc -o fork2 fork2.crootwww 代码# ./fork2boydaughterparent多次运行rootwww 代码# ./fork2boydaughterparentrootwww 代码# ./fork2boydaughterparentrootwww 代码# ./fork2boydaughterparentrootwww 代码# ./fork2boydaughterparentfork函数启动一个新的进程,前面我们说过,这个进程几乎是当前进程的一个拷贝输出的时间间隔变长 3、思考:i.编译连接通过后,多次运行程序,观察进程并发执行结果:ii.如果多次运行输出内容没有变化,请分析原因。并改写原程序,延长每个进程的执行时间,再次观察运行情况。iii. 如果多次运行输出内容发生变化,并分析原因。iv. 将进程放在后台运行,用pstree观察进程的宗族关系。v. 系统创建一个新进程(使用系统调用fork)与让系统执行一个新程序(使用系统调用exec)有什么差异?Fork都是被重新调用因此输出内容无变化运行多次输出内容变化说明fork调用发生错误4、思考:i.编译连接通过后,多次运行程序,观察进程并发执行结果:ii.语句sleep(1);起什么作用?删除所有sleep(1);语句,并观察运行结果;iii.删除wait(0);语句,并观察运行结果,并请分析两次结果不同的原因,理解wait的作用。rootwww 代码# cat fork4.c#include #include #include #include #include #include #include int main() char buf100; pid_t cld_pid; int fd; if(fd=open(temp,O_CREAT|O_TRUNC|O_RDWR,S_IRWXU)=-1) printf(open error%d,errno); exit(1); strcpy(buf,This is parent process writen); if(cld_pid=fork()=0) /*这里是子进程执行的代码*/ strcpy(buf,This is child process writen); printf(This is child processn); sleep(1); printf(My PID (child) is%dn,getpid(); /*打印出本进程的ID*/ sleep(2); printf(My parent PID is %dn,getppid(); /*打印出父进程的ID*/ sleep(3); write(fd,buf,strlen(buf); close(fd); exit(0); else /*这里是父进程执行的代码*/ wait(0); /*如果此处没有这一句会如何*/ printf(This is parent processn); sleep(1); printf(My PID (parent) is %dn,getpid(); /*打印出本进程的ID*/ sleep(1); printf(My child PID is %dn,cld_pid); /*打印出子进程的ID*/ sleep(1); write(fd,buf,strlen(buf); close(fd); return 0;rootwww 代码# gcc -o fork4 fork4.cfork4.c: In function main:fork4.c:18: 警告:隐式声明与内建函数 exit 不兼容fork4.c:20: 警告:隐式声明与内建函数 strcpy 不兼容fork4.c:32: 警告:隐式声明与内建函数 strlen 不兼容fork4.c:34: 警告:隐式声

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论