实验四 Linux进程编程

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

实验四 Linux进程编程(4课时)
实验目的:
理解进程,掌握进程的创建;掌握进程创建、进程载入的函数的使用。

实验原理:
进程是一个具有独立功能的程序关于某个数据集合的一次可以并发执行的运行活动,是处于活动状态的计算机程序。

进程作为构成系统的基本细胞,不仅是系统内部独立运行的实体,而且是独立竞争资源的基本实体。

了解进程的本质,对于理解、描述操作系统有着极为重要的意义。

了解进程的活动、状态,也有利于编制复杂程序。

Linux下进程相关函数主要包括如下几种:
进程的创建
fork
(1)fork函数说明
执行一次返回两个值,父进程的返回值是子进程的进程号,而子进程则返回0 。

(2)fork函数语法
fork函数的语法格式如下所示。

头文件
#include <sys/types.h> // 提供类型pid_t的定义
#include <unistd.h>
函数原型
pid_t fork(void);
函数返回值
0:子进程
子进程ID(大于0的整数):父进程
-1:出错
exec函数族
(1)exec函数族说明
fork函数是用于创建一个子进程,该子进程几乎拷贝了父进程的全部内容。

exec函数族就提供了一个在进程中启动另一个程序执行的方法。

它可以根据指定的路径和文件名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新的内容替换了。

另外,这里的可执行文件既可以是二进制文件,也可以是Linux 下任何可执行的脚本文件。

exec函数族语法
实际上,在Linux中并没有exec()函数,而是以exec开头的函数族,它们之间语法有细微差别。

exec函数族语法格式如下所示。

头文件
#include <unistd.h>
函数原型
第二个:命令的名字,第三个:命令的参数;第四个参数:结束
intexecl(const char *path, const char *arg, ...);
intexecv(const char *path, char *constargv[]);
intexecle(const char *path, const char *arg, ..., char *constenvp[]);
intexecve(const char *path, char *constargv[], char *constenvp[]);
intexeclp(const char *file, const char *arg, ...);
intexecvp(const char *file, char *constargv[]);
函数返回值
出错1:-1
函数表示
实验内容:
1 完成实验教程上的fork例程及exec组的使用系列例程,并对比不同的exec族函数参数上的异同?
2完成实验教程上的exit例程,比较exit及_exit的异同?完成waitpid例程。

exec函数组调用实例
使用execlp函数,采用逐个列举方式,并且使用系统默认的环境变量。

if(fork()==0){
/*调用execlp函数,这里相当于调用了“ls -l”命令*/
if(execlp("ls","ls","-l",NULL)<0)
perror("execlp error!");
}
使用execl函数时需要给出完整的文件路径来查找对应的可执行文件。

/*调用execl函数,注意这里要给出ls程序所在的完整路径*/
if(execl("/bin/ls","ls","-l",NULL)<0)
perror("execl error!");
使用execle时可以将环境变量添加到新建的子进程中去
/*命令参数列表,必须以NULL结尾*/
char *envp[]={"PATH=/tmp","USER=sunq",NULL};
/*调用exec le函数,注意这里也要指出env的完整路径*/
if(execle("/bin/env","env",NULL,envp)<0)
perror("execle error!");
使用exec ve函数时,通过构造指针数组的方式来传递参数,注意参数列表一定要以NULL作为结尾标识符。

/*命令参数列表,必须以NULL结尾*/
char *arg[]={"env",NULL};
char *envp[]={"PATH=/tmp","USER=sunq",NULL};
if(execve("/bin/env",arg,,envp)<0)
perror("execve error!");
实验内容:
1 完成实验教程上的fork例程及exec组的使用系列例程并对比不同的exec族函数参数上的异同。

GCC还有一些其它编译选项也能够产生有用的警告信息。

这些选项大多以-W开头,其中最有价值的当数-Wall了,使用它能够使GCC产生尽可能多的警告信息。

2完成实验教程上的exit例程比较exit及_exit的异同。

完成waitpid例程。

3 完成实验教程上的守护进程例程并说明守护进程创建流程daemon。

完成实验教程上的syslog例程。

4完成实验教程上的实验内容并分析该程序完成的工作。

5 产生子进程,子进程显示“in child process”及子进程、父进程的进程号然后睡眠3s,在父进程中显示“in parent process”及父进程的进程号并等待回收子进程资源,完成后显示“child process exited”,接着退出。

6 编写程序实现5次循环输出“child process replaced”,然后退出,作为子进程的代码。

然后编写程序创建子进程,然后调入子进程代码,在父进程输出“parent process”8次,并用wait回收子进程的资源。

子进程对应的文件名及保存位置自定.
7创建子进程,然后子进程输出“wait 5s”,睡眠5秒,然后结束本进程,父进程输出“parent process”,并等待子进程结束,回收资源。

实验结果与讨论:
1、针对实验内容中的问题给出你的回答
2、谈谈你今天上实验课的收获,存在的问题或疑问。

如果有实验内容以外的发现也可谈谈。

注意:写实验报告时,实验步骤不一定要全抄,可选重要的。

但实验目的、实验内容以及实验步骤中提出的问题及答案一定要写。

相关文档
最新文档