操作系统试验二_第1页
操作系统试验二_第2页
操作系统试验二_第3页
操作系统试验二_第4页
全文预览已结束

付费下载

下载本文档

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

文档简介

1、欢送共阅暨南大学本科实验报告专用纸一、实验目的通过进程的创立、撤销和运行加深对进程概念和进程并发执行的理解,明确进程 与程序之间的区别。二、 实验环境及设备L r 1|(一) 实验室名称:计算机实验室(二) 主要仪器设备:PC机、Linux操作系统环境 |.,-I1三、 实验内容- -(1)编写一段程序,使用系统调用fork()来创立两个子进程,并由父进程重复 显示字符某字符申和自己的标识数,而子进程那么重复显示某字符申和自己的标识 数。(2)编写一段程序, 使用系统调用fork()来创立一个子进程。 子进程通过系统调用exec()更换自己的执行代码,显示新的代码后,调用exit()结束。而父

2、进程那么调用waitpid()等待子进程结束,并在子进程结束后显示子进程的标识符,然后正常结束。四、实验调试分析1 1、实验函数说明|(1) fork()创立新进程要创立一个进程,最根本的系统调用是fork。系统调用fork用丁派生一个进程,头文件:#include 函数定义:int fork( void );返回值:子进程中返回0,父进程中返回子进程ID,出错返回-1函数说明:一个现有进程可以调用fork函数创立一个新进程。由fork创立的新 进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返 回的唯一区别是子进程中返回0值而父进程中返回子进程ID。子进

3、程是父进程 的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的 是上述存储空间的 副本,这意味着父子进程问不共享这些存储空间,它们之间共享的存储空间只有代码段。(2) exec函数族头文件:#include 函数族:int execl(const char *path, const char *arg, .);int execlp(const char *file, const char *arg, .);int execle(const char *path, const char *arg, const char *envp);int execv(const char

4、*path, const char *argv);int execve(const char *path, const char *argv, const char *envp;int execvp(const char *file, const char *argv);参数说明:匚1 rJIexeclexecl的第一个参数是包括路径的可执行文件,后面是列表参数,列表的第一个 为命令path,接着为参数列表,最后必须以NULL结束。jI ,: |execlpexeclp的第一个参数可以使用相对路径或者绝对路径。fl I IIexeclpexeclp后包括指向一个自定义环境变量列表的指针,此列表

5、必须以NULL结束execv,execv, v表示path后面接收的是一个向量,即指向一个参数歹U表的指针,注意 这个歹0表的最后 一项必须为NULL。execveexecve path后面接收一个参数歹U表向量,并可以指定一个环境变量歹U表向量execvpexecvp第一个参数可以使用相对路径或者绝对路径,v表示后面接收一个参数列表向量。execexec被调用时会替换调用它的进程的代码段和数据段(但是文件描述符不变), 直接返回到调用它的进程的父进程,如果出错,返回-1并设置errno。(3)exit()终止进程函数. X*. I头文件:#include exit()函数的作用是:直接使进程

6、停止运行,活除其使用的内存空间,并活除其 在内核中的各种数据结构。(4)waitpid ()父进程等待子进程中等或结束后才执行头文件:#include或#include定义函数:pid_t waitpid(pid_t pid,int* status,int options);函数说明:waitpid()会暂停止目前进程的执行,直到有信号来到或子进程结束。如果在调用waitpid()时子进程已经结束,那么waitpid()会立即返回子进程结束状态值。子进程的结束状态值会由参数status返回,而子进程的进程识别码也会一起返回。如果不在意结束状态值,那么参数status可以设成NULL参数pid为

7、欲等待的子进程识别码,其他数值意义如下:pid0等待任何子进程识别码为pid的子进程。参数options提供了一些额外的选项来控制waitpid,参数option可以为0或可以用T运算符把它们连接起来使用。2、实验调试(1)实验一调试刚开始在写两个fork()程序时,是将两个fork()函数写在一起,如果是这 样的话,第二次调用fork()语句时就可能不满足实验的要求了,因为父子进程的执行顺序是任意的,在第二次调用fork()函数时,可能是第一次调用产生的子进程在调用这个fork()函数,就会返回0值,不符合实验要求创建两个子进程的条件,因此应在确定当前进程时父进程时才调用fork()语句创立

8、第二个子进程。(2)实验二调试创立子进程后,调用execl()将参数中指定的新进程代替原有的进程,假设能够 成功替换该进程就不会执行该函数后面的exit(0),转向执行新进程,待所有的子进程执行完毕后,就会转向执行waitpid()函数,再返回子进程的识别码,并 输出;假设没有替换成功就会执行execl()后面的语句exit(0),终止当前的子进 程,再转向执行waitpid()语句。备注:实验调试过程中未能将调试结果截图是本次实验的一大败笔。下次会注意的。五、 实验结果I六、 实验源程序/*实验二程序*/#include #include #include I - _.int main()p

9、id_t pid1,pid2;/*先创立一个子进程*/pid1=fork();if (pid10)/*pid1没创立子进程成功*/printf( fail to fork.n );exit(1);else if (pid1 = 0)printf( child,pid is : %un ,getpid();else(printf( parent,pid is :%un ,getpid();/*假设是父进程,那么再新创立其子进程*/pid2=fork();if (pid20)printf( fail to fork.n );exit(1); else if (pid2 = 0) printf( c

10、hild,pid is : %un ,getpid(); else printf( 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 = 0)/*假设是子进程*/printf( new program.n);/*替换当前的进程*/execl( /root/fork.out , fork.out ,0);/*假设没有替换成功,终止该子进程*/ exit(0); else /*假设子进程全部执行结束,*/*那么返

温馨提示

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

评论

0/150

提交评论