操作系统实验二.docx

上传人:苏美尔 文档编号:11652629 上传时间:2021-08-28 格式:DOCX 页数:5 大小:68.82KB
返回 下载 相关 举报
操作系统实验二.docx_第1页
第1页 / 共5页
操作系统实验二.docx_第2页
第2页 / 共5页
操作系统实验二.docx_第3页
第3页 / 共5页
操作系统实验二.docx_第4页
第4页 / 共5页
操作系统实验二.docx_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《操作系统实验二.docx》由会员分享,可在线阅读,更多相关《操作系统实验二.docx(5页珍藏版)》请在三一文库上搜索。

1、暨南大学本科实验报告专用纸(附页)暨南大学本科实验报告专用纸课程名称操作系统原理实验成绩评定实验项目名称 进程控制 指导教师 戴红实验项目编号 0806002902 实验项目类型 综合型实验地点 学生姓名蔡高成 学号 2007052431学院国际商学院系企业管理专业信息管理与信息系统实验时间 年 月 日 下午 温度 C 湿度一、实验目的通过进程的创建、撤销和运行加深对进程概念和进程并发执行的理解,明确进程 与程序之间的区别。二、实验环境及设备(一)实验室名称:计算机实验室(二)主要仪器设备:PC机、Linux操作系统环境三、实验内容(1)编写一段程序,使用系统调用fork()来创建两个子进程,

2、并由父进程重复 显示字符某字符串和自己的标识数,而子进程则重复显示某字符串和自己的标识 数。(2)编写一段程序,使用系统调用fork()来创建一个子进程。子进程通过系统调用 exec()更换自己的执行代码,显示新的代码后,调用 exit()结束。而父进程则调用 waitpid()等待子进程结束,并在子进程结束后显示子进程的标识符,然后正常结束。四、实验调试分析1、实验函数说明(1) fork ()创建新进程要创建一个进程,最基本的系统调用是fork。系统调用fork用于派生一个进程,头文件:#include 函数定义:int fork( void );返回值:子进程中返回0,父进程中返回子进程

3、ID,出错返回-1函数说明:一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回 的唯一区别是子进程中返回 0值而父进程中返回子进程ID。子进程是父进程的 副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是 上述存储空间的 副本”,这意味着父子进程间不共享这些存储空间,它们之间共享的存储空间只有代码段。(2) exec函数族头文件:#include 函数族:int execl(const char *path, const char *arg,);int execlp(c

4、onst char *file, const char *arg,);int execle(const char *path, const char *arg, const char *envp);int execv(const char *path, const char *argv);int execve(const char *path, const char *argv口,const char *envp口;int execvp(const char *file, const char *argv);参数说明:execl的第一个参数是包括路径的可执行文件,后面是列表参数,列表的第一个

5、为命令path,接着为参数列表,最后必须以 NULL结束。execlp的第一个参数可以使用相对路径或者绝对路径。execle最后包括指向一个自定义环境变量列表的指针,此列表必须以NULL结束 execv, v表示path后面接收的是一个向量,即指向一个参数列表的指针,注意 这个列表的最后一项必须为NULL 0execve path后面接收一个参数列表向量,并可以指定一个环境变量列表向量execvp第一个参数可以使用相又t路径或者绝对路径,v表示后面接收一个参数列表向量。exec被调用时会替换调用它的进程的代码段和数据段(但是文件描述符不变),直接返回到调用它的进程的父进程,如果出错,返回 -1

6、并设置errno。(3) exit ()终止进程函数头文件:#include exit()函数的作用是:直接使进程停止运行,清除其使用的内存空间,并消除其 在内核中的各种数据结构。(4)waitpid ()父进程等待子进程中等或结束后才执行头文件:#include 或 #include定义函数:pid_t waitpid(pid_t pid,int * status,int options);函数说明:waitpid()会暂而停止目前进程的执行,直到有信号来到或子进程结束。如果在调用 waitpid() 时子进程已经结束,则waitpid() 会立即返 回子进程结束状态值。子进程的结束状态值会

7、由参数status 返回,而子进程的进程识别码也会一起返回。如果不在意结束状态值,则参数status可以设成NULL参数pid为欲等待的子进程识别码,其他数值意义如下:|pid0等待任何子进程识别码为pid的子进程。参数options 提供了一些额外的选项来控制waitpid ,参数option 可以为0或可以用|运算符把它们连接起来使用。2、实验调试(1)实验一调试刚开始在写两个fork()程序时,是将两个fork()函数写在一起,如果是这样的话,第二次调用 fork()语句时就可能不满足实验的要求了,因为父子 进程的执行顺序是任意的,在第二次调用fork()函数时,可能是第一次调用产生的子

8、进程在调用这个fork()函数,就会返回0值,不符合实验要求创建两个子进程的条件,因此应在确定当前进程时父进程时才调用fork()语旬创建第二个子进程。(2)实验二调试创建子进程后,调用execl()将参数中指定的新进程代替原有的进程,若能够成功替换该进程就不会执行该函数后面的exit(0),转向执行新进程,待所有的子进程执行完毕后,就会转向执行 waitpid()函数,再返回子进程的识别码,并 输出;若没有替换成功就会执行 execl()后面的语句exit(0),终止当前的子进 程,再转向执行 waitpid()语句。备注:实验调试过程中未能将调试结果截图是本次实验的一大败笔。下次会注意的。

9、五、实验结果3暨南大学本科实验报告专用纸(附页)六、实验源程序/*实验二程序*/#include #include #include int main()pid_t pid1,pid2;/*元创建一个子进程*/pid1=fork();if (pid10)/*pid1没创建子进程成功*/ printf( fail to fork.n ); exit;else if (pidl = 0)printf( child,pid is : %un ,getpid(); elseprintf( parent,pid is :%un ,getpid();/*若是父进程,则再新创建其子进程*/ pid2=for

10、k();if (pid20) printf( fail to fork.n ); exit; else if (pid2 = 0)printf( child,pid is : %un ,getpid(); elseprintf( parent,pid is :%un ,getpid() );return 0;/*实验二程序*/#include #include #include #include int main()pid_t pid;int result;/*创建子进程*/pid = fork();if (pid 0) printf( fork error );else if (pid =

11、0)/*若是子进程*/printf( new program.n);/*替换当前的进程*/execl( /root/fork.out , fork.out ,0);/*若没有替换成功,终止该子进程*/ exit(0); else /*若子进程全部执行结束,*/*则返回子进程的进程标识码*/int e=waitpid(pid,&result,0);printf( Child process PID:%d.n ,e); exit(0);七、实验心得 5暨南大学本科实验报告专用纸(附页)通过做这次实验,了解了子进程和父进程的调用顺序,以及调用的结果,而且通 过调用fork ()可以知道存在三种情况下,子进程发生调用的变化#

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1