《UNIX环境高级编程》这本书怎么看?怎么学习
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《UNIX环境高级编程》这本书怎么看?怎么学习相关的知识,希望对你有一定的参考价值。
W.Richard Stevens 先生所著之书比较适合有经验的人进一步深入学习W.Richard Stevens 先生所著的UNIX 环境高级编程、UNIX网络编程、TCP/IP详解是难得的入门好书,但这里的入门指得是研究生级别的入门。Stevens 先生所著之书多半是为了给研究生上课时用做教材,因此 Stevens 先生假设阅读这些书的人至少已经接受过了系统的计算机技术本科教育,已经拥有了比较系统的计算机相关基础理论知识。在书中 Stevens 先生假设读者拥有了最基础的操作系统理论,网络技术理论,以及UNIX理论和实践经验,并拥有数种业界常用的UNIX系统作为学习环境(在国外的大学里很容易获得),这样才能体会书中所述的细节。因此这些书刚接触时看似通俗易懂,但在阅读细节上却对读者要求甚高,如果没有足够的专业理论和系统实践是很难真正读进去的。
所以,对于没有接受过系统的计算机专业教育的爱好者,或者主要以 linux 系统维护,或以linux 桌面应用为主的普通用户,Stevens 先生的书并不是很合适的阅读对象。
因此,就我个人的看法,掌握任何一种知识都是需要投入的。我们需要花费金钱去得知识来源(花钱买书,花钱上网,花钱培训),需要花费宝贵的时间去阅读(人生匆匆几十年,没多少时间可以给我们去浪费),需要花费精力去理解书中的内容(基础知识越扎实,理解所学内容越快,但累积基础同样需要大量时间和精力),需要找到合适的环境(光看不实践心里是不会有底的)去验证自己掌握的东西。因此,如果在决定投入之前,先要摸清楚自己到底想要达到什么样的目标,这个目标是否切合自己的实际(相信一个在流水线上辛苦劳作的普通工人,即使学会了计算机编程也是没有用武之地的,除非他有机会离开流水线)。自己是否有足够的资源承载自己的理想(如对于温饱问题尚未解决之人,要他花上千上万的钱去学MBA显然是不现实的)。
同时,任何一本书都会对读者提出一个基本的知识架构和程度上的要求,比方说即使是文学博士,让他去读高能物理学方面的书也会要他的命的。因此在选择所读之书前,先要对自己的实际能力做一次详细的评估,看自己目前到了哪种阶段,是否有能力去掌握自己想要掌握的东西。千万不要因为好高骛远而勉力为之。选择适合自己当前水平的书去阅读并理解,远好过拿着大师所著的神作干瞪眼。
如果主要希望掌握UNIX下的编程技术,尤其是网络编程技术的话,可以有两条路走:
1、以实际需要完善知识架构:为自己做一个项目,比方说自己写个简单的 Web 服务器,因为现在 Web 应用非常丰富,既有成熟的客户端如浏览器可以配合,又有足够全的文档如 RFC文档可供参考,再加上最基本的 socket 编程经验,就可以开始做自己的 Web 服务器。一步一步的为 Web 服务器添加流行的功能,如支持后台 FastCGI 接口,支持 WebDAV,支持流媒体等。在这个过程中不断地学习和掌握相关的理论知识,有时在发觉设计上的不足时甚至需要推翻全盘重新架构。当最终一个完全符合自己心意且足够实用的 Web 服务器做成时,就拥有了可以由自己支配和修改的服务器,同时也掌握了相关的专业理论。这种方式比较适合有一定专业基础的人使用。优点是直观,方向明确所以学习效率高。缺点是需求驱动,形成知识架构不容易完整。
2、系统掌握计算机专业理论:最好的书就是大学里的理论教科书,这些书不会去讲解过于具体的计算机应用,而是从概念开始讲起,力图使学习者获得一个完整的知识体系。只要以后碰到的工作和这个知识体系相关,自然就能很快学会。这种方式比较适合没有基础,或者希望深入学习的人使用,优点是知识架构会逐渐趋于完整,理论功底扎实,后劲足。缺点是花费时间长,方向不明确所以学习效率低,初期会因缺少实践而进展缓慢。 参考技术A 如果对linux 不熟悉的建议 先看看鸟哥的私房菜。如果已经很熟悉,这本算是linux程序员的工具书了,不过可以看看书里的代码,学习下风格
UNIX环境高级编程笔记之文件I/O
一、总结
在写之前,先唠几句,《UNIX环境高级编程》,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情。其实大概三年前,那会大三,我就买了这本书,也看过一些,但好像没有留下什么印象,今天再看,依然觉得像新的一样。很大的原因我想是一直以来都在用windows(用windows做开发为什么学不到真正的技术,我想大家都懂的),当然知识结构不完整,学习能力这些就不说了。所以,对于那些致力于想在Linux下做开发的人来说,这本说一定是强推的。
如果你分得清write和发fwrite,read和fread这些函数的区别,那这章也许就对你没什么吸引力了。本人之前面试腾讯,也被问到这个问题,当时胡乱瞎扯了一通,也真是囧。
这章大体上讲了两件事:1)什么是不带缓冲的I/O;2)如何在多个进程间共享文件。作为总结,我用自己的话简单说一下这两个问题,详细的内容可以看上面这幅图。
对于第一个问题,不带缓冲指的是每个read和write这些文件I/O操作都调用的是系统调用,属于内核态的操作。而诸如fread和fwrite这些标准I/O操作属于用户态操作,具体是库函数的实现,需要借助用户缓冲区来实现(关于用户态和内核态的理解请看Linux探秘之用户态与内核态)。所以,不带缓冲是相对带用户缓冲区来说的(如果只从字面上理解缓冲,其实文件I/O也是带缓冲的,只不过内核缓冲区,具体后面开一篇博客来讲)
对于第二个问题,文件的共享需要让多个文件间扯上关系,不然也没辙。UNIX使用三种数据结构(进程表项,文件表项和V-Node节点表项)来表示一个打开的文件,如下图。这样当多个进程访问一个文件,只用新建一个进程表项,然后引用对应的文件即可。其中存在着:一个进程对应一个独立的文件表项,一个文件仅有一个V-Node表项。
因为一个文件仅有一个V-Node表项,所以,为了保证文件在多个进程间共享,需要谨慎处理好文件的一致性。比如两个进程A和B要写数据到一个文件,一般调用的是lseek和write这两个函数,首先A lseek写入的位置(如1500),然后转到B 也lseek到1500,又转到A开始write 100个字节,文件长度变为1600个字节,又转到B,但B此时从第1500个字节处开始write,这就造成写文件错误。因此,对于这样的多个操作造成文件共享信息的不一致,UNIX给出的解决方案是原子操作,对于上面这种情况的一个解决方案是使用open+O_APPEND组合的原子操作。
二、看图说话
一图胜过千言,看图!
以上是关于《UNIX环境高级编程》这本书怎么看?怎么学习的主要内容,如果未能解决你的问题,请参考以下文章