LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1382|回复: 8

关于"Advanced Programming in the UNIX Environment"一书的若干

[复制链接]
发表于 2003-2-25 11:12:51 | 显示全部楼层 |阅读模式
最近刚开始看这本书(作者:W.Richard Stevens),有不少地方不是很懂,所以发帖请大家
帮我回答回答。
说明:我买的中译本,由"尤晋元"等译

问题1:
  $1.4.4的第一句话:"标准I/O函数提供一种对不用缓存的I/O函数的带缓存的界面"。这句话应该如何理解?在后面练习题的答案我也不是很能明白。哪些函数要用缓存,哪些
不用?
  
问题2:
  $1.10中作者讲解了用来度量进程的扫时间时用到的三个进程时间值:"时钟时间","用户CPU时间"和"系统CPU"时间。请问这三个时间值有什么区别?我看了几遍也没能理解。


问题3:
  在第25页($2.5.3)中提到了一个概念:"终端文件"。这是指什么?

问题4:
  练习题3.5题如何作答?


最后还要请大家不吝赐教。谢谢!
发表于 2003-2-25 15:46:13 | 显示全部楼层
呵呵,这可是一本好书,认真学习之后一定会受益非浅。
1。这句话的中文确实有点不太通顺。我想它的意思是指标准I/O函数不需要自己指定缓存的大小,这些函数本身就可以自行处理所需要的缓存,成为一个面向底层I/O系统调用的操作界面。
2。这几个时间与进程管理有一定关系。时钟时间指进程运行的时间总量,也就是进程从开始运行到实际结束所经历的时间。因为linux是多任务的,可以同时运行几个进程。假如说cpu只运行一个进程A时要5分钟时间,而同时cpu还要运行其它两个进程B和C,分别需要3分钟和4分钟。如果一开始就运行进程A,运行结束后再运行进程B和C。则进程A的时钟时间是5分钟。如果进程A刚一运行cpu就转去运行B和C,完了之后再来运行A,则进程A的时钟时间将是3分钟+4分钟+5分钟,而真正进程A占用cpu的时间只有5分钟。所以时钟时间与系统同时运行的进程数量有关。理解这一点后,我们就会知道用户cpu时间就是进程A实际占用cpu的时间。由于内核在调度进程A时也要占用cpu,这部分时间就是系统cpu时间。这是为了管理进程所付出的开销。
3。在unix和linux中,任何的设备都是文件。终端设备也是文件。可以用正常的方式读写。
4。第一条命令是把a.out的执行结果输出到outfile中,如果有错误,则把错误输出重定向到标准输出。第二条命令是把a.out执行时的错误输出到标准输出中,再把a.out的执行结果输出到outfile中。这两条命令的差别在于2>&1的位置不同。第一条命令包含了a.out>outfile时错误的输出,而第二条命令不包括。具体来说,如果outfile文件不存在,在a.out>outfile时,系统会提示出错(实际上并不是这样)。这条错误信息在第一条命令中就会被重定向到标准输出,在第二条命令中就不会被定向到标准输出。
 楼主| 发表于 2003-2-25 18:13:05 | 显示全部楼层
很感谢您的回答!您的回答使我明白多了!

还望以后多多指教,我刚开始学Unix,所以问题肯定很多,还望您不吝赐教!
发表于 2003-4-25 04:14:16 | 显示全部楼层
今天没事儿翻出老问题来看,胡乱补充 kj501 的发言。

1,fread() 是有缓冲的, read() 是没有缓冲的。
2,用户时间和系统时间,分别是程序运行是处于用户状态和系统状态模式用掉的时间。系统时间并不是系统调度进程花费的时间。
3,
4,我没有这本书,不知道。:)
发表于 2003-4-25 11:22:51 | 显示全部楼层
对于系统时间理解不深,多谢viper的补充。
发表于 2003-4-25 17:34:01 | 显示全部楼层
标准I/O函数是不需要你来设置缓冲的(其实也可以自定义一下),而read/write之类的低级I/O是需要你来定义缓冲区的,你每次用read/write的时候都应该定义了一个数组吧。大概就是这个意思呢。
BTW:我认为这本书的翻译不怎么样的说,很多地方的翻译很晦涩,需要比较长时间的琢磨才能理解。我后来看的是清华出的Unix程序设计教程,APUE有的内容这本书基本都有,更加上了一些有关socket的内容,很不错。
发表于 2004-11-11 23:15:22 | 显示全部楼层
请问Richard Stevens的这本书的附录B关于错误信息打印出来的那两段代码究竟是作为两个单独文件(文件名是什么)还是插入头文件后呀?
感觉头文件只是声明了函数,后面是函数的定义。
PS:刚开始学unix下的编程
发表于 2004-11-12 08:12:16 | 显示全部楼层
文件名是什么无所谓,把他们编译成.o文件,在编译应用程序时把他们一起编译就行了。这样在你的应用程序中就可以使用这两个文件定义的函数输出错误信息了。
发表于 2004-11-14 20:47:01 | 显示全部楼层
谢谢,解决了
发现一个问题,由于在Linux平台编译log_xxx error function的debug变量应该去掉extern这个修饰符才可以编译通过
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表