操作系统B2-上机实验-进程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验二Linux 进程实验

姓名:段叶叶班级:信息1302 学号:07131052

地点:东区实验室FF109

时间:2014年10月13日星期一

成绩:

一、实验内容

1.创建进程的系统调用fork();

2.创建进程的系统调用vfork();

3.执行新程序的系统调用exec();

4.等待进程结束的系统调用wait()或waitpid()。

前三题必做,最后一题选做。

二、实验目的

熟悉进程的系统调用。

三、实验环境

登陆Linux虚拟机,进入Linux shell,提示符为$,表示普通用户提示符。

四、实验题目

1. 【题目】:编写程序forkgrandchild.c,用来创建孙子进程。

【要求】:在读懂程序forktest.c的基础上,编写程序

forkgrandchild.c(forkgrandchild.c创建在用户名(如wm)目录下的process 目录下),所创建的程序forkgrandchild.c可实现创建孙子进程,并显示孙子进程的pid,其父进程的pid,forkgrandchild.c要求可读性好,用户界面友好。

【预备知识】:

1)Linux进程状态

●运行状态:程序正在运行或在运行队列中等待运行。

●可中断等待状态:进程正在等待某个事件完成,等待过程可被信号或定时器

唤醒。

●不可中断等待状态:进程正在等待某个事件完成,不可被信号或定时器唤醒,

必须等待事件的发生,才可唤醒。

●僵死状态:进程已终止,但进程描述符依然存在,直到父进程调动wait()函

数后释放。

●停止状态:进程因收到SIGSTOP SIGSTP SIGTIN SIGTOU信号后停止运行

或该进程正在被跟踪(调式程序时)。

2)ps命令

●ps命令可查看进程的当前状态。

●如ps aux(相关命令参数自学)

●对ps命令结果字符的解释

<(高优先级进程)、N(低优先级进程)、L(内存锁页,即页不可被换出内存)、s(该进程为会话首进程)、l(多线程进程)、+(进程位于前台进程组)、R(运行状态)、Z(僵死状态)、D(不可中断等待状态)、S(可中断等待状态)、T(停止状态)。

3)fork()函数

fork()是创建一个新进程的唯一方法,子进程可以继承其父进程几乎所有的资源。在命令行下使用man 2 fork 可获得该函数的函数声明。fork()有两个返回值。成功调用fork后,当前进程实际上已经分裂为两个进程,一个是原来的父进程,另一个是刚刚创建的子进程。父子进程在调用fork地方分开,一个是父进程调用fork的返回值,返回值为刚刚创建的子进程的pid;另一个是子进程中fork函数的返回值,为0。fork返回两次的前提是进程创建成功,若失败返回为-1。用返回值可区分父子进程。

fork之后是父还是子进程先运行是不确定的,这取决于内核所使用的调度算法,一般是交替执行,使进程享有同等执行权。

forktest.c 源代码

【问题】:

1)解释stdio.h、unistd.h、sys/types.h头文件的作用?

2)getpid()、getppid()、fork()的功能是什么?

3)写出forkgrandchild.c的源代码。

2. 【题目】:diffork.c 的创建

【要求】:

上机实现下面diffork.c 的运行,体会fork ()和vfork ()的区别。

【预备知识】:

1) fork ()和vfork ()的区别

● fork ()和vfork ()都是调用一次,返回值两次。

● fork ()创建一子进程时,子进程只是完全复制父进程资源,这样得到的子

进程独立于父进程,具有良好的并发性,但开销较大,有时是不需要的,比如fork 一个进程后,立即调用exec 执行另一个应用程序,那么fork 过程中子进程对父进程地址空间的复制将是一个多余的过程,而vfork

()创建的

子进程共享父进程的地址空间,不拷贝父进程的地址空间,这大大减少了系统开销。

vfork()保证子进程先运行,当它调用exec()或exit之后,父进程才可能被调度。

【注意】:

将diffork.c中的sleep()的参数增大些,开启另一个终端,在该终端下输入ps aux查看父子进程的信息,特别是状态信息。

【结果】:

3. 【题目】:执行新程序的系统调用exec()

【要求】:

上机实现下面processimage.c和execve.c的运行,体会执行新程序的系统调用。

【预备知识】:

1)使用fork或vfork创建子进程后,子进程通常会调用exec函数来执行另

外一个程序,系统调用exec用于执行一个可执行程序以代替当前进程的

执行映像。

2)exec调用并没有生成新进程,一个进程一旦调用exec函数,它本身就死

亡了。系统把代码段替换成新的程序的代码,废弃原有的数据段和堆栈

段,并为新进程分配新的数据段和堆栈段,唯一保留是pid,即,对系统

而言,还是同一个进程,不过执行的已经是另一个程序了。

3)exec函数族有6种不同的调用形似,如execv()、execve()等,它们

声明在unistd.h中。

【注意】:

1)理解带参数的main()函数。

2)在Linux命令行下,使用man execve 获取该函数的帮助。

【问题】:先编译链接processimage.c,再编译链接execve.c,查看运行结果,结果说明了什么?

运行结果截图见下页

相关文档
最新文档