洛阳师范学院UNIX实验报告-6-1
- 格式:doc
- 大小:8.34 MB
- 文档页数:7
测试过程:(实验中出现的问题、错误、解决方法)
基本算法思想掌握之后,程序的大体流程可以写出来,
具体的问题,就是有时候会因为对个别函数的参数应用出问题
老师有问必答,全部都给解决了
实验总结:
签名
2012 年 5 月 22 日 评语与成绩:
教师签名:
年 月 日 洛阳师范学院信息技术学院
软件实验报告
专业: 软件工程 课程: UNIX高级编程
学号: 姓名: 班级:
实验名称 进程控制
实验类型 验证型 实验时间 2012-5-22
实验环境 虚拟机下装有linux操作系统的windows操作系统
实验目的与要求:
理解进程环境概念;
理解进程启动、执行、退出过程;
掌握获取环境列表的方法 实验内容:
1、 查看进程环境表
1) 参考教材p126,理解环境表的构成;
2) 访问环境表的方法有几种?分别说明访问方法和步骤;
3) 编程输出环境表的首地址,画出进程虚地址空间的大致构成;
4) 编程遍历环境表,输出所有环境变量的定义和取值。
5) 任选一个环境变量,修改其取值,并验证结果。
2、 编程设置终止处理程序
1) 使用atexit函数设置一个终止处理函数,要求程序退出前输出一个任意字符串;
2) 分别以如下形式编写main函数,观察执行结果:
(1) main函数隐式返回;
(2) return语句返回;
(3) exit函数返回;
(4) _exit函数返回;
3) 上述程序执行结果为什么不同?解释其原因。 实验步骤:(算法描述、源程序、操作步骤和方法)
查看进程环境表
a.参考教材p126,理解环境表的构成;
每个程序都接收到一张环境表。与参数表一样,环境表也是一个字符指针数组,其中每个指针包含一个以null结束的字符串的地址。全局变量environ则包含了该指针数组的地址。
Extern char **environ;
例如:如果该环境包含五个字符串,那么它看起来可能如下图所示:
其中,每个字符串的结束处都有一个null字符。我们称environ为环境指针,指针数组为环境表,其中各指针指向的字符串为环境字符串。
b.访问环境表的方法有几种?分别说明访问方法和步骤;
A.全局变量environ包含了环境表的字符指针数组的地址。
可通过全局变量environ对环境表进行访问
Extern char **environ;
B.在历史上,大多数UNIX系统对main函数提供了第三个参数,它就是环境表地址: Int main(int argc,char *argv[],char *envp[]); 因为ANSIC规定main函数只有两个参数,而且第三个参数与全局变量environ相比也没有带来更多益处,所以POSIX.1也规定应使用environ而不是用第三个参数。
C.通常用getenv和putenvhanshu 来存取特定的环境变量,而不是用environ变量。但是,如果要查看整个环境,则必须使用environ指针。
c.编程输出环境表的首地址,画出进程虚地址空间的大致构成
因为环境表的首单元为存储的为HOME常量,所以在此处,输出HOME的地址。
程序如下图:
运行结果如下图所示:
存储器的存储空间安排:
编程遍历环境表,输出所有环境变量的定义和取值。
程序如下图:
运行结果: 任选一个环境变量,修改其取值,并验证结果。
由于LOGNAME为系统常量,无法修改,所以下面程序的意义不大。
修改环境变量的大致流程如下程序所示:
在环境表中重新设置一个“test”变量,并对其直进行赋值,和修改。
编程设置终止处理程序
1) 使用atexit函数设置一个终止处理函数,要求程序退出前输出一个任意字符串;
2) 分别以如下形式编写main函数,观察执行结果:
(1) main函数隐式返回;
(2) return语句返回;
(3) exit函数返回;
(4) _exit函数返回;
上述程序执行结果为什么不同?解释其原因。
1、exit函数和return函数的主要区别是:
1)exit用于在程序运行的过程中随时结束程序,其参数是返回给OS的。也可以这么讲:exit函数是退出应用程序,并将应用程序的一个状态返回给OS,这个状态标识了应用程序的一些运行信息。
main函数结束时也会隐式地调用exit函数,exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准I/O函数tmpfile()创建的临时文件。
exit是系统调用级别的,它表示了一个进程的结束,它将删除进程使用的内存空间,同时把错误信息返回父进程。通常情况:exit(0)表示程序正常, exit(1)和exit(-1)表示程序异常退出,exit(2)表示系统找不到指定的文件。
2)return是语言级别的,它表示了调用堆栈的返回;return是返回函数值并退出函数,通常0为正常退出,非0为非正常退出,请注意,如果是在主函数main, 自然也就结束当前进程了(也就是说,在main()里面,你可以用return
n,也能够直接用exit(n)来做),如果不是在main函数中,那就是退回上一层调用。在多个进程时,如果有时要检测上个进程是否正常退出,就要用到上个进程的返回值。
2、正常终止的前4种, 即exit系列函数.
#include
void exit(int status);
void _Exit(int status);
#include
void _exit(int status);
以上3个函数的区别是:
exit()(或return 0)会调用终止处理程序和用户空间的标准I/O清理程序(如fclose), 而 _exit和_Exit不调用而直接由内核接管进行清理。因此, 在main 函数中exit(0)等价于return 0.