高级Linux程序设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

AdvancedLinuxProgramming高级Linux程序设计卷I网址作者MarkMitchellJeffreyOldhamAlexSamuel高级Linux程序设计·卷一·Linux平台上的高级UNIX编程完美废人译谨以此书献给四月你是我生命中的奇迹程序设计·卷一·Linux平台上的高级UNIX编程完美废人译译者序在CSDN论坛潜水多年,看同学们讨论学习C++的书籍的选择的时候,总是对那些经典大部头有种本能的恐惧。我自己也是一样。在学习Linux编程的开始时候,我曾在RichardStevens的经典著作面前徘徊不前。很幸运的,有朋友向我推荐了这本AdvancedLinuxProgramming。它内容浅显语言生动,很快带领我进入了Linux程序设计的殿堂。之后再阅读Stevens等大师的著作也便不再显得生涩而困难。但是,当我向其他朋友推荐这本书的时候,却往往因为语言的关系而被婉拒。这样一本优秀的入门读物无法在广大以中文为母语的学生中无法普及,实在是一件莫大的憾事。于是我就有了翻译这本书的念头。在这里我首先希望对原书的三位作者表示感谢,感谢他们写了,并以无私的精神免费公开了,这样一本优秀的技术书籍。其次,我想感谢几位朋友为本书的翻译、校对过程作出的贡献,他们是:CSDN论坛的无锋之刃、猪头流氓、标准C匪徒、hellwolf,老兵团的超越无限。尤其感谢四月:可以说,没有你,就不会有这卷中文译本的诞生。译本与原书一样,按照OpenPublicationLicensev1.0发行。OPL全文可以从找到。欢迎将本书在网上复制分发,但请保留原作者与译者的版权信息。如有平面媒体愿意出版或刊载本书的全部(仅卷I或全书)或部分,请与我联系。姓名:高远昵称:完美废人主页:电子信箱:wolf0403@hotmail.com谢谢!程序设计·卷一·Linux平台上的高级UNIX编程完美废人译Linux系统中的高级UNIX编程1起步2编写优质GNU/Linux软件3进程4线程5进程间通信程序设计·卷一·Linux平台上的高级UNIX编程完美废人译第一章:起步本章将向你展示如何在Linux系统中完成一个C/C++程序的基本步骤。具体来说,本章讲解了如何在Linux系统中编辑C和C++源码,编译并调试得到的程序。如果你已经对Linux环境下的程序编写相当熟悉,则完全可以跳过本章内容,直接开始阅读第二章,“编写优质的GNU/Linux软件”。第二章中2.3节“编写及使用程序库”中包含了对静态和动态库的比较,这也许是你还不知道的内容,值得关注。我们在编写本书的时候,假定你已经对C或C++程序设计语言以及标准C库的函数相当熟悉。除了为展示有关C++独有的特性的情况时,书中的示例代码均用C语言写就。同时,我们还假定你知道如何在Linuxshell中执行一些基本操作,例如创建文件夹和复制文件等。因为许多Linux程序员都是在Windows环境下开始的编程,我们会在一些时候特别指出两个平台上的不同点。1.1用Emacs进行编辑编辑器(editor)是用于编辑代码的工具程序。Linux平台上有各种不同的编辑器,但是昀流行的、提供了昀丰富特色的,当属GNUEmacs了。关于EmacsEmacs决不仅仅是一个编辑器。它是一个出奇强大的程序。在CodeSourcery,它被亲切地称为“theOneTrueProgram”(译者注:记得Matrix里的TheOne吧^_^)或者直接简称OTP。在Emacs中你可以查阅、发送电子邮件,你可以将Emacs进行任意的定制与扩充;可能性太多以至于不适合在这里进行讨论了。你甚至可以在Emacs中浏览网页!如果你熟悉其它的编辑器,你当然可以选择使用它们。本书中的任何内容都不会依赖Emacs的特性。不过,如果你仍然没有一个习惯使用的Linux下的编辑器,那么你应该跟随这篇不长的教程,尝试学习一下Emacs的使用。如果你喜欢Emacs并希望对它的高级特性了解得更多,你或许应该考虑阅读其它一些关于Emacs的书籍。有一篇非常不错的教程,《学习Emacs》(LearningGNUEmacs),作者是DebraCameron、BillRosenblatt和EricS.Raymond(O’Reilly公司于1996年出版。该书已由机械工业出版社翻译并出版,书名《学习GNUEmacs(第二版)》)。1.1.1打开C/C++代码文件要运行Emacs,你只需在终端窗口中输入emacs并回车。当Emacs开始运行之后,你可以利用窗口顶部的菜单创建一个新的文件。点击“文件File”菜单,选择“打开文件OpenFiles”,然后在窗口底部的“minibuffer”中输入你希望打开的文件的名字。1如果你要创建的是一篇C代码,则后缀名应该选择.c或.h。如果创建的是C++代码,后缀名应在.cpp、.hpp、.cxx、.hxx、.C或者.H中选择。当文件被打开之后,你可以像是使用其它任何字处理程序一样进行输入。保存文件只需要从文件菜单中选择“保存缓冲区SaveBuffer”即可。当你准备退出Emacs的时候,只需从文件菜单选择“退出EmacsExitEmacs”就可以。,你需要通过F10键来访问菜单。高级Linux程序设计·卷一·Linux平台上的高级UNIX编程完美废人译如果你不喜欢用鼠标指点江山,你可以选择使用键盘快捷键完成这些操作。输入C-xC-f可以打开文件(C-x的意思是按下Ctrl键的同时按x键)。C-xC-s是保存文件,而C-xC-c则是退出Emacs。想要进一步熟悉Emacs,可以从帮助菜单中选择Emacs指南(EmacsTutorial)。这份文档中提供了无数帮助你更快捷有效地使用Emacs的技巧。1.1.2自动化排版如果你已经习惯了在集成开发环境(IntegratedDevelopmentEnvironment,IDE)中编写程序,你一定乐意由编辑器自动帮助你对代码进行排版。Emacs同样提供了这种功能。当你打开一个C/C++代码的时候,Emacs自动识别出这是一篇代码而不仅是普通文本文件。当你在一个空行中点下Tab键的时候,Emacs会将光标移动到合适的缩进位置。如果你在一个已经包含了内容的行中点击Tab键,Emacs会将该行文字缩进到合适的地方。假设你输入了下面几行文字:intmain(){printf(“Hello,world\n”);}当你在调用printf的一行点下Tab键的时候,Emacs会将代码重新排版成这个样式:intmain(){printf(“Hello,world\n”);}注意中间一行被添加了合适的缩进。当你更多地使用Emacs之后,你会发现它会帮你解决各种复杂的排版问题。如果你有兴趣,你甚至可以对Emacs进行程序控制,让它完成任何你可以想象得到的自动排版工作。人们利用Emacs的这个能力,为几乎任何种类的文档实现了Emacs编辑模式,甚至实现了游戏2和数据库前端。1.1.3语法高亮除了对代码进行排版,Emacs可以通过对C或C++程序的不同元素加以染色以方便阅读。例如,Emacs可以将关键字转为一种颜色,int等内置类型使用第二种颜色,而对注释使用第三种颜色等。通过染色,你可以很轻松地发现一些简单的语法错误。昀简单的打开语法染色功能的途径是在~/.emacs文件中插入下面一行文字:(global-font-lock-modet)将这个文件保存,然后退出并重新启动Emacs,再打开那些C/C++代码,开始享受吧!你可能注意到,刚才插入.emacs文件的文字看起来像是LISP程序语言的代码。这是因为,那根本就是LISP代码!Emacs的很大部分都是用LISP实现的。你可以通过编写LISP代码为Emacs加入更多的功能。如果你对那些老式的文本模式冒险游戏有兴趣的话,试着运行M-xdunnet命令。高级Linux程序设计·卷一·Linux平台上的高级UNIX编程完美废人译1.2用GCC编译编译器可以将人类可读的程序代码转化为机器可以解析执行的对象代码。Linux系统中提供的编译器全部来自GNU编译器集合(GNUCompilerCollection),通常被称为GCC。3GCC中包含了C、C++、Java、Objective-C、Fortran和Chill语言的编译器。本书中我们主要关注的是C和C++语言的程序设计。假设你有一个项目,其中包含一个如列表1.2中所示的C++程序(reciprocal.cpp)和一个如列表1.1所示的C程序(main.c)。这两个文件需要被编译并链接成为一个单独的程序reciprocal。4这个程序可以计算一个整数的倒数。代码列表1.1(main.c)C源码——main.c#includestdlib.h#includestdio.h#include“reciprocal.hpp”intmain(intargc,char**argv){inti;i=atoi(argv[1]);printf(“Thereciprocalof%dis%g\n”,i,reciprocal(i));return0;}代码列表1.2(reciprocal.cpp)C++源码——reciprocal.cpp#includecassert#include“reciprocal.hpp”doublereciprocal(inti){//i不能为0assert(i!=0);return1.0/i;}还有一个包含文件reciprocal.hpp(列表1.3中)。代码列表1.3(reciprocal.hpp)包含文件——reciprocal.hpp获取更多GCC相关的信息。4在Windows系统中,可执行程序的名称通常以.exe结尾,而在Linux中通常没有后缀名。因此在Windows中,这个程序可能被称为reciprocal.exe而Linux版本则是简单的reciprocal。高级Linux程序设计·卷一·Linux平台上的高级UNIX编程完美废人译#ifdef__cplusplusextern“C”{#endifexterndoublereciprocal(inti);#ifdef__cplusplus}#endif我们要做的第一步,就是将代码文件转化为对象文件。1.2.1编译单个代码文件C程序编译器是gcc。可以通过指定–c选项编译C源码文件。因此,输入下面这一条命令可以将main.c文件编译成名为main.o的对象文件:%gcc–cmain.cC++编译器是g++。它的操作方式与gcc非常相似。下面一行命令可以完成对reciprocal.cpp的编译:%g++-creciprocal.cpp在这里,选项–c通知编译器只产生对象文件;否则编译器会尝试链接程序并产生昀终的可执行文件。在执行完第二个命令之后你应该得到的是一个名为reciprocal.o的对象文件。要构建一个大型的程序,你可能还需要熟悉其它一些选项。-I选项会告诉编译器去哪里寻找包含文件。默认情况下,GCC会在当前目录及标准库的包含文件所在的路

1 / 107
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功