实验三-进程管理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三进程管理
一、实验目的
1.熟悉和理解进程和进程树的概念,掌握有关进程的管理机制
2.通过进程的创建、撤销和运行加深对进程并发执行的理解
3.明确进程与程序、并行与串行执行的区别
4.掌握用C 程序实现进程控制的方法
二、实验学时
2学时
三、实验背景知识
所涉及的系统调用
1、exec( )系列(exec替换进程映像)
系统调用exec( )系列,也可用于新程序的运行。fork( )只是将父进程的用户级上下文拷贝到新进程中,而exec( )系列可以将一个可执行的二进制文件覆盖在新进程的用户级上下文的存储空间上,以更改新进程的用户级上下文。exec( )系列中的系统调用都完成相同的功能,它们把一个新程序装入内存,来改变调用进程的执行代码,从而形成新进程。如果exec( )调用成功,调用进程将被覆盖,然后从新程序的入口开始执行,这样就产生了一个新进程,新进程的进程标识符id与调用进程相同。
exec( )没有建立一个与调用进程并发的子进程,而是用新进程取代了原来进程。所以exec( )调用成功后,没有任何数据返回,这与fork( )不同。exec( )系列系统调用在UNIX系统库unistd.h中,共有execl、execlp、execle、execv、execvp五个,其基本功能相同,
只是以不同的方式来给出参数。
#include
int execl(const char *pathname, const char *arg, …);
int execlp(const char *filename, const char *arg, …);
int execle(const char *pathname, const char *arg, …, const char *envp[ ]);
int execv(const char *pathname, char *const argv[ ]);
int execvp(const char *filename, char *const argv[ ]);
参数:
path参数表示你要启动程序的名称包括路径名。
arg参数表示启动程序所带的参数,一般第一个参数为要执行命令名,不是带路径且arg必须以NULL结束。
返回值:成功返回0,失败返回-1
注:上述exec系列函数底层都是通过execve系统调用实现.
1)带l 的exec函数:execl,execlp,execle,表示后边的参数以可变参数的形式给出且都以一个空指针结束。
#include
#include
#include
int main(void)
{
printf("entering main process---\n");
execl("/bin/ls","ls","-l",NULL);
printf("exiting main process ----\n");
return 0;
运行结果:利用execl将当前进程main替换掉,所有最后那条打印语句不会输出。
2)带p 的exec函数:execlp,execvp,表示第一个参数path不用输入完整路径,只有给出命令名即可,它会在环境变量PATH当中查找命令
#include
#include
#include
int main(void)
{
printf("entering main process---\n");
if(execl("ls","ls","-l",NULL)<0)
// if(execlp("ls","ls","-l",NULL)<0)
perror("excl error");
return 0;
}
结果不能替换,因没有指定路径名。若将蓝色语句换成红色部分内容执行,则可以替换成功。3)不带l 的exec函数:execv,execvp表示命令所需的参数以char *arg[]形式给出且arg最后一个元素必须是NULL。
#include
#include
#include
int main(void)
{
printf("entering main process---\n");
int ret;
char *argv[] = {"ls","-l",NULL};
ret = execvp("ls",argv);
if(ret == -1)
perror("execl error");
printf("exiting main process ----\n");
return 0;
}
4)带e 的exec函数:execle表示,将环境变量传递给需要替换的进程
2、exec( )和fork( )联合使用
系统调用exec和fork( )联合使用能为程序开发提供有力支持。用fork( )建立子进程,然后在子进程中使用exec( ),这样就实现了父进程与一个与它完全不同子进程的并发执行。
一般,wait、exec联合使用的模型为:
int status;
............
if (fork( )= =0)
{