《UNIX环境高级编程第一章课后习题解析》由会员分享,可在线阅读,更多相关《UNIX环境高级编程第一章课后习题解析(2页珍藏版)》请在金锄头文库上搜索。
1、UNIX环境高级编程第一章课后习题解析UNIX环境高级编程的第一章中交代的东西似乎没有意思,不过这些东西却非常的重要。除了一些基础的东西之外,需要引起我们注意的是errno,在UNIX编程中起着非常重要的作用。细心的朋友在阅读两卷UNIX网络编程的时候也发现了,在第一章中同样交代了errno的相关知识。我想只有在必要的基础知识都了解的情况下,才能以后的学习过程中减少不必要的麻烦。1.1 在系统上查证,除根目录外,目录的 . 和 . 是不同的。解析:对于这个问题我们只需去验证就可以了,根目录是系统中其它所有目录的根,显然这个性质是UNIX中其它目录不具有的。我们可以随意找一个目录验证就可以了,当
2、然结果和题干中的描述是一致的。1.2 分析程序清单1-4的输出,说明进程ID为852和853的进程发生了什么情况。解析:确切一些说在第二次调用a.out之前,有两个进程占用了852和853这两个进程ID,当然仅仅凭借程序清单的输出我们无法得知在第二次调用a.out时那两个进程究竟怎么样了,也许是正在运行,也许是刚刚结束,总之是在这个时间窗口内有两个进程曾经占用了852和853这两个进程ID。1.3 在1.7 节中,perror的参数是用ISOC的属性const定义的,而strerror的整型参数则没有用此属性定义,为什么?解析:这个问题与UNIX编程没有太大的关系,不过这提示我们在编写函数的要
3、注意一些东西。首先要明确的就是C语言函数参数传递机制,不论传递什么类型的参数,C语言总是将参数做一个拷贝(数组将变为指针)。这个时候我们在函数中对参数自身值的修改仅仅是修改了拷贝之后的那个副本,对原变量不会造成影响。如果我们在函数的参数列表中的某个形参前面加上const修饰的话,那么我们就无法对这个拷贝的量自身值做出修改,对于const int *这样的形参我们无法修改其指向地址中的数据。对于strerror函数来说,不需要const来修饰形参,因为即使形参值被修改了也不会影响到实参,因为仅仅是修改了一个在另一个拷贝数据。这对于我们传递的实参errno来说不会造成任何影响。而perror就不同
4、了,如果形参没有const修饰的话,就可以通过指针修改其指向地址中的数据,如果之后我们仍然期望使用这个字符串,但是函数又因为设计问题修改了字符串的数据,那么程序的运行结果就会与预期不相符。1.4 在附录B包含了出错记录函数log_doit,当调用该函数时,先保存了errno的值,为什么?解析:其实解释这个问题并不困难,甚至我们不需要了解这个函数是做什么的,原因就是snprintf之前调用了vsnprintf函数,我们无法保证这个函数正确运行,一旦该函数发生了错误就会修改errno的值。此时函数处理出来的字符串信息就会与实际情况不相符。这就是要保存errno值的原因。1.5 若日历时间存放在带符
5、号的32位整型数中,那么到哪一年它将溢出?可以用什么方法扩展浮点数?它们是否与已存在的应用相兼容?解析:我们不应该把重点放置在到底哪一年时间将溢出,因为我们要考虑一些多余的东西,我们需要知道的是32位有符号整数存储能力是非常有限的,时间总是会在不久的将来溢出,所以我们没有必要去关注到底是在哪一年溢出的,可以我们有时间去解决这个问题。这个问题第二个部分让人摸不到头绪,书后的习题答案中是对整个问题是这样解释的:“在2038年。将time_t数据类型定为64位整型,就可以解决该问题了。如果它现在是32位整型,那么为使应用程序正常工作应当对其重新编译。但是这一问题还有更糟糕之处。某些文件系统及备份介质以32位整数存储时间。对于这些同样需要加以更新,担忧需能读旧的格式”看到英文原文之后就觉得这个题目的翻译有点坑啊,不管怎么说都扯不到浮点数上面啊,看了书后给出的答案之后就恍然大悟了,总算是明白题干要表达什么意思了,这样对于书后的答案就可以很好地理解了。1.6 若进程时间存放在带符号的32位整型数中,而且每秒为100滴答,那么经过多少天后改时间值将会溢出?解析:相信32位有符号整数的上限值都会计算,这个题目的问题就是希望将时间的滴答数存入整型数据中,恩,接下来就很好计算了,关于计算问题这里就不再赘述了。