您的位置:首页 > 其它

实验三 进程与线程

2014-04-20 02:59 211 查看
一、实验名称:实验三 进程与线程

二、实验日期:2014/3/13

三、实验目的:

1. Linux进程

2. 简单的进程同步

四、实验的步骤和方法

实验1 Linux进程家族树

文件名3-1-1.c:看程序写结果。

要求:
增加1个fork()、2个fork()、多个fork()的结果会怎样?并说明原因,找出规律。
增加1个fork()
3-1-1-1.c
增加2个fork()
3-1-1-2.c

增加n个fork()
结果会有2n个进程。
在fork()语句后添加如下2条语句,结果将如何?
printf(“get the child pid: %d\n”,getpid());
printf(“get the parent pid: %d\n”,getppid());

3-1-2.c

init进程
init进程是系统所有进程的起点,内核在完成内核引导以后,即在本线程(进程)空间内加载init程序,它的进程号是1。init进程是所有进程的发起者和控制者。因为在任何基于UNIX的系统(比如 Linux)中,它都是第一个运行的进程,所以init进程的编号(Process ID,PID)永远是1。如果init出现了问题,系统的其余部分也就随之不可用。

init进程有两个作用:
① 扮演终结父进程的角色。因为init进程永远不会被终止,所以系统总是可以确信它的存在,并在必要的时候以它为参照。如果某个进程在它衍生出来的全部子进程结束之前被终止,就会出现必须以init为参照的情况。此时那些失去了父进程的子进程都会以init作为它们的父进程。
快速执行一下“ps –af”或者top或者gnome-system-monitor命令,可以列出当前运行的进程来。
② 在进入某个特定的运行级别(Runlevel)时运行相应的程序,以此对各种运行级别进行管理。

实验2 父子进程同步实验

文件名3-2.c:实现子进程先输出”child proc”,父进程后输出” parent proc”。

要求:
请总结实现简单的父子进程同步的一般方法。
3-2.c

Linux中父子进程同步相关系统调用
1)进程终止
void exit(stat)
主要任务:自我终止,将进程状态变为”僵死”状态,等待父进程用wait系统调用来收集。一般参数可设为0,即exit(0)。
exit()
在执行该函数时,进程会检查文件打开情况,清理I/O缓存,如果缓存中有数据,它们就会写入相应的文件,这样就防止了文件数据的丢失!然后终止进程。
_exit()
在执行该函数时,并不清理标准输入输出缓存,而是直接清除内存空间,当然也就把文件缓存中尚未写入文件的数据给销毁了。由此可见,使用exit()函数更加安全。

父进程等待子进程终止
pid_t wait([int*stat_addr]0)
一般参数可设为0,即wait(0)

实验3 子进程映像的重新装入

创建一进程child.c,功能是输出”I am a child.”,再创建一个父进程3-3.c加载该子进程 。
要求:
理解子进程映像的重新装入。

Linux中子进程映像的重新装入
Linux提供了一组系统调用exec函数,主要功能是将指定的可执行文件加载到指定的进程映像中,覆盖该进程映像中原有的程序。
此类系统调用有execl()、execle()、execlp()、execv()、execve()、execvp()
本课只介绍execl()和execv()
execl(“路径名/文件名”,0)

execv(file, argv)

参数定义:
char *file 指向文件全名(路径名/文件名)的指针;
char *argv
指向命令及参数的指针。
加载成功则直接执行,不返回;不成功返回-1

Child.c
创建一个child.c源文件并编译成child执行文件

3-3.c

实验4 子进程映像的重新装入

创建一进程child1.c,再创建一个父进程3-4.c加载该子进程。
要求:
1. 理解子进程映像的重新装入。
2. 掌握exec类函数的用法及功能。
3-4.c:改写子进程的功能为调用键盘命令ls –l,已知该键盘命令的路径与文件名为:/bin/ls
在子进程分支中,用execl加载自己的程序后,添加一条语句如printf(“ok!\n”);结果将如何?

Child1.c

3-4.c

五、实验结果或结论
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: