实验三 进程与线程
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
五、实验结果或结论:
二、实验日期: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
五、实验结果或结论:
相关文章推荐
- Python中单线程、多线程和多进程的效率对比实验
- 【Linux之路】进程与线程(实验)
- 实验:一个进程到底能创建多少线程?
- 进程与线程(七)APC的实验,古老的Code
- Python中单线程、多线程和多进程的效率对比实验
- Python中单线程、多线程和多进程的效率对比实验
- Linux进程线程实验
- 进程及线程管理实验1
- 实验:一个进程到底能创建多少线程?
- WinCE 编程实验(第三章 进程与线程的描述和调度)
- 操作系统--线程和进程/线程管道通信实验
- 进程及线程管理实验2
- 进程和线程实验总结
- Python中单线程、多线程与多进程的效率对比实验
- ReaderWriterLock(定义支持单个写线程和多个读线程的锁),Mutex(一个同步基元,也可用于进程间同步。 )
- 进程与线程
- 操作系统实验----实验二 进程管道通信实验
- 进程间的通信方式与线程间通信的方式
- JAVA学习笔记49——线程概念+进程、线程区别+创建进程三种方法
- 线程,进程和程序的简单比较