1.编写程序,用size命令查看Linux可执行文件结构。
2.对程序做若干修改,查看可执行文件结构的改变,分析并给出结论
程序代码test.c+运行结果:
实验分析:
代码区(test):指令常量、const声明变量、字符串常量。
数据段(data):全局或静态已经初始化的变量。
未初始化的数据段(bss):没有初始化的全局变量和静态变量。
在此次测试中,修改后的test.c文件中字符串增加了 ” world!!”,包括空格在内的八个字符,所以test段增加8个,用static定义了a=123,为静态已初始化变量,所以data段发生变化。
□实验3.2.3 内存管理函数测试
1.编写程序测试函数memcpy()和memmove()。
2.分析两个函数的实现过程有何不同。
程序代码+运行结果:
实验分析:
参考网址:
http://blog.csdn.net/li_ning_/article/details/51418400
Memcpy():内存逐个字节复制
Memmove():在实现单元内存复制的时候考虑到了源空间和目的空间是否会有空间重叠的问题
memcpy对内存空间有要求的,dest和src所指向的内存空间不能重叠,否则复制的数据是错误的.
memmove在拷贝之前就做了一个判断,如果dest <= src,就按照memcpy的思路拷贝,如果dest>src它是从后面往前拷贝,这样就能正确拷贝数据了。
本次测试结果相同是因为编译器都优化成了可以考虑内存重叠的情况。
■实验3.4.1进程与命令行选项及参数
1.写一个命令行选项解析程序,支持以下功能。
短选项 长选项 参数
-a --all 可以跟参数
-d --dir 不跟参数
-h --help 不跟参数
-o --output 必须跟一个参数
代码截图:
函数参考了课本案例P68 getopt_long_options。
运行结果:
实验分析:
第一次测试,输入格式正确,全部输出,第二次测试,-o后必须加参数但是测试没有带参数,没有输出this is output。
□实验3.4.4Linux时间管理
1.自己设计格式,输出日期和时间。
代码截图:
运行结果:
实验分析:百度了头文件”time.h”,和里面的函数体time_t,Linux下存储时间常见的有两种存储方式,一个是从1970年到现在经过了多少秒,一个是用一个结构来分别存储年月日时分秒的。
time_t 这种类型就是用来存储从1970年到现在经过了多少秒,要想更精确一点,可以用结构struct timeval,它精确到微妙。
struct timeval
{
long tv_sec; /*秒*/
long tv_usec; /*微秒*/
};
而直接存储年月日的是一个结构:
struct tm
{
int tm_sec; /*秒,正常范围0-59, 但允许至61*/
int tm_min; /*分钟,0-59*/
int tm_hour; /*小时, 0-23*/
int tm_mday; /*日,即一个月中的第几天,1-31*/
int tm_mon; /*月, 从一月算起,0-11*/ 1+p->tm_mon;
int tm_year; /*年, 从1900至今已经多少年*/ 1900+ p->tm_year;
int tm_wday; /*星期,一周中的第几天, 从星期日算起,0-6*/
int tm_yday; /*从今年1月1日到目前的天数,范围0-365*/
int tm_isdst; /*日光节约时间的旗标*/
};
需要特别注意的是,年份是从1900年起至今多少年,而不是直接存储如2011年,月份从0开始的,0表示一月,星期也是从0开始的, 0表示星期日,1表示星期一。