apue《UNIX环境高级编程第三版》第一章答案详解

     大家好,从这周开始学习apueUNIX环境高级编程第三版》,在此,我要感谢网易的一个工程师朋友和室友,没有他们,我不会开始真正的学习这本书,希望大家以后开始慢慢进步。废话少说,直接上课后习题了。

UNIX高级编程第一章习题答案:

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

答:这个验证有很多方法可使用命令ls cdvim等,目录.指向当前目录,目录..指向父目录,在根目录中这两个是相同的。首先是根目录


可见在根目录下,目录.目录..都是指向本目录的。


结果显然易见。有兴趣可以使用vim .vim..

1.2分析图1-6程序的输出,说明进程ID852853的进程发生了什么情况?

答:UNIX是多任务系统,在程序运行的同时其他两个进程也在运行,编程运行如下图所示


由上图可见进程PID是一直增大的,小水试图使用lsof  -p 15122去查询中间的那个进程,可是一无所获,因此可以判定这个进程在小水试图去抓它的时候已经结束了。为什么进程的PID一直在增大,会增大到什么程度?

1.31.7节中,perror的参数是用ISO C的属性const定义的,而strerror的整形参数没有用此属性定义,为什么?

答:因为perrormsg参数是个指针,perror就可以改变msg指向的字符串。然而使用限定符const限制了perror不能修改msg指针指向的字符串。而对于strerror,其错误号参数是整数类型,并且C是按值传递所有参数,因此即使strerror函数想修改参数的值也修改不了,也就没有必要使用const属性。

以我的理解是这样的:可以从两个函数的定义去理解

char  *strerror(int errnum);

void   perror(const char *msg);

strerror函数将errnum (通常就是errno)映射为一个出错消息字符串,并返回此字符串的指针,而errno的值通常是不定的(可参考errno的规则),存在多种不同的errno,当然不能使用cons修饰符了。

     而perror的作用基于error当前值,在标准错误上产生一条错误信息,首先msg它是指向error的,不能指向其他地方,不管当前error是何值,其内容是固定的,因此需要使用const。它首先输出msg所指向的字符串,然后是一个冒号,一个空格,接着是对应的errno值,最后换行符。

1.4若日历存放在带符号的32位整形数中,那么哪一年它将溢出?可用什么方法扩展溢出的浮点数,采用的策略是否与现有的应用相兼容?

答:首先确定起始时间为 T=197011日 00:00:00,然后是带符号的32位所存储的时间t=231/(60*60*24*365)=68.0962598年,所以溢出时间为T+t=1970+68=2038年。其溢出解决办法是将time_t数据类型定义为64位整形。

1.5若进程时间存放在带符号的32位整形中,而且每秒100滴答,经过多少天后该数溢出?

答:t=231/(60*60*24*100)=248.551348天。

最后送上格言:学习不能固步自封。。。(如有错误的地方请指正)



本书全面介绍了UNIX系统的程序设计界面—系统调用界面标准C库提供的许多函数。 本书的前15章着重于理论知识的阐述,主要内容包括UNIX文件目录、进程环境、进程控制、 进程间通信以及各种I/O。在此基础上,分别按章介绍了多个应用实例,包括如何创建数据库函数库, PostScript 打印机驱动程序,调制解调器拨号器及在伪终端上运行其他程序的程序等。 本书内容丰富权威, 概念清晰精辟,一直以来被誉为UNIX编程的“圣经”,对于所有UNIX程序员—无论是初学者还是专家级人士 —都是一本无价的参考书籍。 目 录 译者序 译者简介 前言 第1章 UNIX基础知识 1 1.1 引言 1 1.2 登录 1 1.2.1 登录名 1 1.2.2 shell 1 1.3 文件目录 2 1.3.1 文件系统 2 1.3.2 文件名 2 1.3.3 路径名 2 1.3.4 工作目录 4 1.3.5 起始目录 4 1.4 输入输出 5 1.4.1 文件描述符 5 1.4.2 标准输入、标准输出标准 出错 5 1.4.3 不用缓存的I/O 5 1.4.4 标准I/O 6 1.5 程序进程 7 1.5.1 程序 7 1.5.2 进程进程ID 7 1.5.3 进程控制 7 1.6 ANSI C 9 1.6.1 函数原型 9 1.6.2 类属指针 9 1.6.3 原始系统数据类型 10 1.7 出错处理 10 1.8 用户标识 11 1.8.1 用户ID 11 1.8.2 组ID 12 1.8.3 添加组ID 12 1.9 信号 12 1.10 UNIX时间值 14 1.11 系统调用库函数 14 1.12 小结 16 习题 16 第2章 UNIX标准化及实现 17 2.1 引言 17 2.2 UNIX标准化 17 2.2.1 ANSI C 17 2.2.2 IEEE POSIX 18 2.2.3 X/Open XPG3 19 2.2.4 FIPS 19 2.3 UNIX实现 19 2.3.1 SVR4 20 2.3.2 4.3+BSD 20 2.4 标准实现的关系 21 2.5 限制 21 2.5.1 ANSI C限制 22 2.5.2 POSIX限制 22 2.5.3 XPG3限制 24 2.5.4 sysconf、pathconf fpathconf 函数 24 2.5.5 FIPS 151-1要求 28 2.5.6 限制总结 28 2.5.7 未确定的运行时间限制 29 2.6 功能测试宏 32 2.7 基本系统数据类型 32 2.8 标准之间的冲突 33 2.9 小结 34 习题 34 第3章 文件I/O 35 3.1 引言 35 3.2 文件描述符 35 3.3 open函数 35 3.4 creat函数 37 3.5 close函数 37 3.6 lseek函数 38 3.7 read函数 40 3.8 write函数 41 3.9 I/O的效率 41 3.10 文件共享 42 3.11 原子操作 45 3.11.1 添加至一个文件 45 3.11.2 创建一个文件 45 3.12 dupdup2函数 46 3.13 fcntl函数 47 3.14 ioctl函数 50 3.15 /dev/fd 51 3.16 小结 52 习题 52 第4章 文件目录 54 4.1 引言 54 4.2 stat, fstatlstat函数 54 4.3 文件类型 55 4.4 设置-用户-ID设置-组-ID 57 4.5 文件存取许可权 58 4.6 新文件目录的所有权 60 4.7 access函数 60 4.8 umask函数 62 4.9 chmodfchmod函数 63 4.10 粘住位 65 4.11 chown, fchown lchown函数 66 4.12 文件长度 67 4.13 文件截短 68 4.14 文件系统 69 4.15 link, unlink, removerename 函数 71 4.16 符号连接 73 4.17 symlink readlink函数 76 4.18 文件的时间 76 4.19 utime函数 78 4.20 mkdirrmdir函数
图书目录 第1章 UNIX基础知识 1 1.1 引言 1 1.2 UNIX体系结构 1 1.3 登录 1 1.4 文件目录 3 1.5 输入输出 6 1.6 程序进程 8 1.7 出错处理 10 1.8 用户标识 12 1.9 信号 14 1.10 时间值 15 1.11 系统调用库函数 16 1.12 小结 17 习题 18 第2章 UNIX标准化及实现 19 2.1 引言 19 2.2 UNIX标准化 19 2.2.1 ISO C 19 2.2.2 IEEE POSIX 20 2.2.3 Single UNIX Specification 25 2.2.4 FIPS 26 2.3 UNIX系统实现 26 2.3.1 SVR4 26 2.3.2 4.4BSD 27 2.3.3 FreeBSD 27 2.3.4 Linux 27 2.3.5 Mac OS X 28 2.3.6 Solaris 28 2.3.7 其他UNIX系统 28 2.4 标准实现的关系 28 2.5 限制 29 2.5.1 ISO C限制 29 2.5.2 POSIX限制 30 2.5.3 XSI限制 32 2.5.4 sysconf、pathconffpathconf函数 32 2.5.5 不确定的运行时限制 38 2.6 选项 42 2.7 功能测试宏 44 2.8 基本系统数据类型 45 2.9 标准之间的冲突 45 2.10 小结 46 习题 46 第3章 文件I/O 47 3.1 引言 47 3.2 文件描述符 47 3.3 open函数 48 3.4 creat函数 49 3.5 close函数 50 3.6 lseek函数 50 3.7 read函数 53 3.8 write函数 54 3.9 I/O的效率 54 3.10 文件共享 56 3.11 原子操作 59 3.12 dupdup2函数 60 3.13 sync、fsyncfdatasync函数 61 3.14 fcntl函数 62 3.15 ioctl函数 66 3.16 /dev/fd 67 3.17 小结 68 习题 68 第4章 文件目录 71 4.1 引言 71 4.2 stat、fstatlstat函数 71 4.3 文件类型 72 4.4 设置用户ID设置组ID 74 4.5 文件访问权限 75 4.6 新文件目录的所有权 77 4.7 access函数 77 4.8 umask函数 79 4.9 chmodfchmod函数 81 4.10 粘住位 83 4.11 chown、fchownlchown函数 84 4.12 文件长度 85 4.13 文件截短 86 4.14 文件系统 86 4.15 link、unlink、removerename函数 89 4.16 符号链接 91 4.17 symlinkreadlink函数 94 4.18 文件的时间 94 4.19 utime函数 95 4.20 mkdirrmdir函数 97 4.21 读目录 98 4.22 chdir、fchdirgetcwd函数 102 4.23 设备特殊文件 104 4.24 文件访问权限位小结 106 4.25 小结 106 习题 107 第5章 标准I/O库 109 5.1 引言 109 5.2 流FILE对象 109 5.3 标准输入、标准输出标准出错 110 5.4 缓冲 110 5.5 打开流 112 5.6 读写流 114 5.7 每次一行I/O 116 5.8 标准I/O的效率 117 5.9 二进制I/O 119 5.10 定位流 120 5.11 格式化I/O 121 5.12 实现细节 125 5.13 临时文件 127 5.14 标准I/O的替代软件 130 5.15 小结 130 习题 130 第6章 系统数据文件信息 133 6.1 引言 133 6.2 口令文件 133 6.3 阴影口令 136 6.4 组文件 137 6.5 附加组ID 138 6.6 实现的区别 139 6.7 其他数据文件 139 6.8 登录账户记录 140 6.9 系统标识 141 6.10 时间日期例程 142 6.11 小结 146 习题 146 第7章 进程环境 147 7.1 引言 147 7.2 main函数 147 7.3 进程终止 147 7.4 命令行参数 151 7.5 环境表 152 7.6 C程序的存储空间布局 152 7.7 共享库 154 7.8 存储器分配 154 7.9 环境变量 157 7.10 setjmplongjmp函数 159 7.11 getrlimitsetrlimit函数 164 7.12 小结 168 习题 168 第8章 进程控制 171 8.1 引言 171 8.2 进程标识符 171 8.3 fork函数 172 8.4 vfork函数 176 8.5 exit函数 178 8.6 waitwaitpid函数 179 8.7 waitid函数 183 8.8 wait3wait4函数 184 8.9 竞争条件 185 8.10 exec函数 188 8.11 更改用户ID组ID 192 8.12 解释器文件 196 8.13 system函数 200 8.14 进程会计 203 8.15 用户标识 208 8.16 进程时间 208 8.17 小结 210 习题 211 第9章 进程关系 213 9.1 引言 213 9.2 终端登录 213 9.3 网络登录 216 9.4 进程组 218 9.5 会话 219 9.6 控制终端 220 9.7 tcgetpgrp、tcsetpgrptcgetsid函数 221 9.8 作业控制 222 9.9 shell执行程序 225 9.10 孤儿进程组 228 9.11 FreeBSD实现 230 9.12 小结 231 习题 232 第10章 信号 233 10.1 引言 233 10.2 信号概念 233 10.3 signal函数 240 10.4 不可靠的信号 242 10.5 中断的系统调用 244 10.6 可重入函数 246 10.7 SIGCLD语义 248 10.8 可靠信号术语语义 250 10.9 killraise函数 251 10.10 alarmpause函数 252 10.11 信号集 256 10.12 sigprocmask函数 258 10.13 sigpending函数 259 10.14 sigaction函数 261 10.15 sigsetjmpsiglongjmp函数 266 10.16 sigsuspend函数 268 10.17 abort函数 274 10.18 system函数 276 10.19 sleep函数 280 10.20 作业控制信号 282 10.21 其他特征 284 10.22 小结 285 习题 285 第11章 线程 287 11.1 引言 287 11.2 线程概念 287 11.3 线程标识 288 11.4 线程的创建 288 11.5 线程终止 291 11.6 线程同步 297 11.7 小结 311 习题 311 第12章 线程控制 313 12.1 引言 313 12.2 线程限制 313 12.3 线程属性 314 12.4 同步属性 318 12.5 重入 324 12.6 线程私有数据 328 12.7 取消选项 331 12.8 线程信号 333 12.9 线程fork 336 12.10 线程I/O 339 12.11 小结 340 习题 340 第13章 守护进程 341 13.1 引言 341 13.2 守护进程的特征 341 13.3 编程规则 342 13.4 出错记录 345 13.5 单实例守护进程 348 13.6 守护进程的惯例 350 13.7 客户进程-服务器进程模型 354 13.8 小结 354 习题 354 第14章 高级I/O 355 14.1 引言 355 14.2 非阻塞I/O 355 14.3 记录锁 357 14.4 STREAMS 370 14.5 I/O多路转接 379 14.5.1 selectpselect函数 381 14.5.2 poll函数 384 14.6 异步I/O 386 14.6.1 系统V异步I/O 386 14.6.2 BSD异步I/O 387 14.7 readvwritev函数 387 14.8 readnwriten函数 389 14.9 存储映射I/O 390 14.10 小结 395 习题 396 第15章 进程间通信 397 15.1 引言 397 15.2 管道 398 15.3 popenpclose函数 403 15.4 协同进程 408 15.5 FIFO 412 15.6 XSI IPC 415 15.6.1 标识符键 415 15.6.2 权限结构 416 15.6.3 结构限制 417 15.6.4 优点缺点 417 15.7 消息队列 418 15.8 信号量 422 15.9 共享存储 427 15.10 客户进程-服务器进程属性 432 15.11 小结 434 习题 434 第16章 网络IPC:套接字 437 16.1 引言 437 16.2 套接字描述符 437 16.3 寻址 439 16.3.1 字节序 440 16.3.2 地址格式 441 16.3.3 地址查询 442 16.3.4 将套接字与地址绑定 449 16.4 建立连接 450 16.5 数据传输 452 16.6 套接字选项 464 16.7 带数据 466 16.8 非阻塞异步I/O 467 16.9 小结 468 习题 468 第17章 高级进程间通信 469 17.1 引言 469 17.2 基于STREAMS的管道 469 17.2.1 命名的STREAMS管道 472 17.2.2 唯一连接 473 17.3 UNIX域套接字 476 17.3.1 命名UNIX域套接字 477 17.3.2 唯一连接 478 17.4 传送文件描述符 482 17.4.1 经由基于STREAMS的管道传送文件描述符 484 17.4.2 经由UNIX域套接字传送文件描述符 486 17.5 open服务器版本1 493 17.6 open服务器版本2 498 17.7 小结 505 习题 505 第18章 终端I/O 507 18.1 引言 507 18.2 综述 507 18.3 特殊输入字符 512 18.4 获得设置终端属性 516 18.5 终端选项标志 516 18.6 stty命令 522 18.7 波特率函数 523 18.8 行控制函数 524 18.9 终端标识 524 18.10 规范模式 529 18.11 非规范模式 532 18.12 终端的窗口大小 537 18.13 termcap,terminfocurses 539 18.14 小结 540 习题 540 第19章 伪终端 541 19.1 引言 541 19.2 概述 541 19.3 打开伪终端设备 544 19.3.1 基于STREAMS的伪终端 547 19.3.2 基于BSD的伪终端 549 19.3.3 基于Linux的伪终端 551 19.4 pty_fork函数 553 19.5 pty程序 555 19.6 使用pty程序 559 19.7 高级特性 564 19.8 小结 565 习题 565 第20章 数据库函数库 567 20.1 引言 567 20.2 历史 567 20.3 函数库 568 20.4 实现概述 569 20.5 集中式或非集中式 572 20.6 并发 574 20.7 构造函数库 574 20.8 源代码 575 20.9 性能 598 20.10 小结 600 习题 601 第21章 与网络打印机通信 603 21.1 引言 603 21.2 网络打印协议 603 21.3 超文本传输协议 605 21.4 打印假脱机技术 605 21.5 源代码 607 21.6 小结 644 习题 645 附录A 函数原型 647 附录B 其他源代码 677 附录C 部分习题答案 685 参考书目 709 索引 715
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值