资源描述:
《实验2linux进程管理》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、实验2Linux进程管理实验目的1、加深对进程概念的理解,明确进程和程序的区别2、进一步认识并发执行的实质3、分析进程争用资源的现象,学习解决进程互斥的方法实验性质验证性实验,必做,3课吋预习与实验要求1、阅读Linux的sched.h源码文件,加深对进程概念的理解2、阅读Linux的fork.c源码文件,分析进程的创建过程要用到的系统调用1、intfork()创建一个新进程炎文件:#include#include返回值的意义:0,创建子进程,从子进程返
2、回的id值-1,创建失败大于0,从父进程返回的子进程idffl2、lockf(files,function,size)锁定/解锁文件或文件的某段该函数的头文件为:#include参数定义:intlockf(intfiles,intfunction,longsize)含义:files是文件描述符;function为1(常量F_LOCK)表示互斥锁定,为0(常MF_ULOCK)表示解锁;size是锁定或解锁的字节数,若用0,表示从文件的当前位賈到文件尾。实验内容0、创建进程。输入并运
3、行下面的程序。思考为什么会输出两行信息。【建议用emacs或gedk编辑】intmain(){intpid;pid=fork();switch(pid){case-1:printf("failtocreateprocess");return1;case0://对于子进程来讲,变量pid的值为0printf('Tmson,mypidis%d,myfather'spidis%d",getpid(),getppid());break;default://对于父进程来讲,pid记录了返回的子进程的I
4、D,必然大于0printffTmfather,mypidis%d,myson'spidis%d",getpid(),pid);nreturn0;}输出结果并非是一行,而是2行。比如,结果可能是:Fmson,mypidis1860,myfather’spidis1859I’mfather,mypidis1859,myson'spidis1860解释:fork函数被调用一次但返回两次。两次返回的唯一区别:子进程中返回0值,父进程中返回子进程1D。为什么返hl两次?原因:linux将父进程的地址空间、
5、数据空间、堆、栈等资源制一份给子进程,子进程是父进程的副本,只有代码段是共亨的。注意:由于在复制吋复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。不同的是,fork()返冋给父进程的是新建子进程的ID,返回给子进程的是0。如果对“返回”还难以理解,想一下学C语言时候的函数调用。函数调用时,将返回地址入栈,再将实参入栈。被调函数从栈中取岀参数,赋值给形参,执行完后,取出返冋地址,跳回去继续执行。1、验证进程并发执行编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时
6、,在系统屮有一个父进程和两个子进程活动。让每个进程在屏幕上显示一个字符串:父进程显示“parentisworking”;两个子进程分别显示“sonisworking”和“daughterisworking”。多运行几次该程序,观察屏幕上的显示结果,并分析原因。<程序1如下>文件名为a21.c#includemain(){intpl,p2;while((pl=fork())==-1);/*创建子进程,将其ID号给pi,直到成功*/if(pl==0)printf(“sonisworki
7、ng”);/*子进程返回的pi才为0,说明此时子进程执行*/else{/*pl>0,说明此pi是父进程函数调用返回的子进程的ID号*/_while((p2=fork())==-1);/*创建子进程p2,将其ID号给p2,直到成功*/if(p2==0)printf(“dauthterisworking’’);/*子进程p2执行*/elseprintf(“parent”);/*父进程执行*/printf(“share”);/*3个进程共享的语句*/}执行:用gcca2l.c-oa21.out编译
8、,产生a21.out文件。在终端里输入./a21.out,并回车执行。看结果。再按向上箭头,并回车重复执行。看结果。如此多执行几次。分析:可以认为,父进程和两个子进程有相同的代码。相当于,上述程序有3份在A存。它们并发执行,但它们返回的ID不同,因此执行不同的分支语句。从进程并发执行来看,输出有多种情况。可能是son在前,也可能是parent或daughter在前。大多数情况下,son先输出。原因:fork()创建进程所需的时间可能要多于输出一个字符串的时间,因此在主