unix高级环境编程.第一章习题答案

习题

1.1,在系统上查证,除根目录外,目录.和..是不同的。

  • 普通目录对比

普通目录对比

  • 根目录对比 
    根目录的对比

1.2, 分析程序1-4的输出,说明进程ID为852和853的进程发生了什么情况?

代码

 
  1. /*1-4

  2. * print the process id

  3. */

  4. #include "apue.h"

  5.  
  6. int main()

  7. {

  8. printf("this Process id:%d",getpid());

  9. return 0;

  10. }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 输出结果

输出结果

分析: 
Linux中,新创建一个进程时,内核会按顺序将下一个可用的进程分配给其使用。每当进程号到达32767的限制时,内核将重置进程号计数器,以便从小整数重新开始分配。 
分配方式具体如下: 
一旦进程号大到达32767,内核会将进程重置为300,而不是1,是因为低数值的进程号为系统进程和守护进程长期占用。


注: 在Linux 2.4版本及更早版本中,进程号的上限是32767,由内核常量PID_MAX所定义。在Linux 2.6版本中,情况有所改变。尽管进程号的默认上限仍是32767,但是可以通过Linux系统特有的/proc/sys/kernel/pid_max文件来进行调整(其值=最大进程+1)。在32位平台中,pid_max文件的最大值为32767,但是在64位平台中,该文件的最大值可以高达2^22次方(约400万),系统可容纳的进程数量会非常庞大。

1.3,在1.7节中,perror的参数是用ISO C的属性const定义的,而strerror的整型参数则没有用此属性。为什么?

  • strerror函数:char * (int errnum);

功能:将errnum(它通常是errno值)映射为一个出错信息字符串,并且返回此字符串的指针

  • perror函数:void perror(const char * msg); 
    功能:它首先输出msg指向的字符串,然后是一个冒号,一个空格,接着是对应errno值的出错信息。最后是一个换行符。

因为msg被定义为const所以在程序执行过程中,它将一直保持调用此函数时传入的值。如果试着修改msg的话,将导致程序无法遍历。即保证msg在输出过程中不被修改。

1.4,在附录B中包含了记录出错函数log_doit,当调用函数时,先保存了errno的值,为什么?

因为errno是全局变量,如果不先保存,可能在执行过程中,errno被修改后,那么log_doit记录的值就不是原来发生错误的值。

1.5,若日历时间存放在带符号的32整数中,那么到那一年它将溢出?用什么方法扩展浮点数?它们是否与与存在的应用兼容?

日历时间是从1970年1月1日 00:00:00开始每个一秒增加1。32位带符号整型最大值为2^31 -1 = 2147483647。然后计算得到最大日期为2038-01-19 11:14:07。即2038年。

扩展浮点数,采用IEEE754编码方式。

1.6 若进程时间存放在带符号的32位整型数中,而且每秒为100滴答,那么经过多少天时间将会溢出。

32位带符号整型最大值为2^31 -1 = 2147483647。一秒增加100。那么2147483647/100/60/60/24 = 248.55天,就会溢出。

猜你喜欢

转载自blog.csdn.net/mark_qzh/article/details/84645396