BBS水木清华站∶精华区
发信人:Kongming(没日没夜...),信区:Linux标题:Re:如何学习linux下编程?
发信站:BBS水木清华站(MonAug211:27:041999)
我为你贴一篇文章吧,简要介绍了Linux下的编程工具,
入门是没有问题的。
这是我最近编写的书的部分内容。
严正声明:
本文由Kongming网友享有专有版权。
版权所有,未经许可,不准随意复制、改编或变相改编、扩散。
主要包含如下内容:
?GNUC、C++编译器
?GNUmake工具
?GNU的调试器
?RCS版本控制系统
并简单介绍了Linux系统上广为流行的Perl脚本语言。
对比了Linux和WindowsNT两种不同的编码风格。
在BBS上看有些困难,拿回家慢慢看吧。
第十三章软件开发
由于操作系统只是一个工具,对大多数读者来说,学习操作系统的最终目的是利用操
作系统上的应用软件完成自己的工作,或者利用开发工具开发应用程序。因此,对一个操
作系统来说,可获得的开发工具,以及这些开发工具是否有效,就成为评价操作系统的一
个重要因素。
这一部分的后三章将主要从开发人员的角度比较Linux和WindowsNT。本章的主要
内容如下:
?介绍操作系统为开发人员提供的各种系统服务;
?介绍操作系统上的主要开发工具。
考虑到许多读者可能对Linux上的开发工具了解不多,因此,本章将介绍一些Linux
上常用的开发工具。当然,软件开发并不是区区一章就能够讲得清楚的,更多的需要读者
自己去实践。
13.1POSIX标准和操作系统接口
13.1.1Linux和WindowsNT对POSIX标准的支持
从第一章的内容我们知道,POSIX是一种标准,主要定义了操作系统的系统调用接口,
POSIX标准最初为提高UNIX系统之间的移植性而开发。Linux是一种POSIX兼容系统,
而WindowsNT中包含了POSIX子系统。但这两个操作系统的POSIX之间有什么区别呢?
POSIX是由非常复杂的标准体系组成的,其中广为接受的POSIX标准是POSIX.1标
准。POSIX.1是一个源代码级的兼容性标准,提供了操作系统的C语言编程接口,内容
涉及到POSIX.1a(系统接口扩展),POSIX.1b(实时),POSIX.1c(线程),POSIX.1d(实
时扩展),POSIX.1e(安全性),POSIX.1f(透明文件访问),POSIX.1g(协议无关服务)
以及POSIX.1h(容错)等。POSIX的另外一个重要标准是POSIX.2标准,它定义了操作
系统的Shell和工具标准。通常谈到的POSIX标准就是这两个标准。Linux支持完整的
POSIX.1和POSIX.2标准;而WindowsNT只提供对POSIX.1的支持,而且是一个不完
整的系统,许多方面(例如I/O)需要Win32API来完成。实际上,WindowsNT的许多
POSIX.1接口是通过Win32API间接实现的。
WindowsNT中的POSIX.1版本基本上没有什么用处,在VisualStudio6.0中,
甚至取消了对POSIX.1的支持。如果读者要在WindowsNT上进行一些POSIX的开发工
作,建议不要使用WindowsNTPOSXI.1。用户可以使用第三方POSIX系统,或者由GNU提
供的GNUWin32工具。这些产品提供了更强大的功能,例如SoftwareSystemInc.的
POSIX.2工具箱(OpenNT)具有如下特征:真正的UNIXShell,以及在WindowsNT中
运行XWindow的能力等。这些软件为WindowsNT的非完整POSIX.1系统增加了如下
特性:
?POSIX.1、POSIX.2和ANSIC接口;
?可在Intel和Alpha平台上使用;
?BSD套接字支持;
?SystemV的共享内存和信号灯IPC机制;
?X11R5客户、库和头文件;
?OPENNTIF(OSF/Motif1.2.4窗口管理器和开发库);
?Colorcurses库;
?完整的Shell作业管理;
?磁带设备支持;
?UNIX开发工具:make、rcs、yacc、lex、cc、c89、nm、ar、strip等。
GNUWin32是针对x86和PowerPC的WindowsNT/95的GNU开发工具。使用这些
开发工具开发的应用程序能够访问MicrosoftWin32API,也能访问Cygwin32API,它
提供了附加的类似UNIX的功能,包括UNIX套接字和进程控制等。利用这些工具,可增
强WindowsNT上POSIX子系统:
?利用标准的MicrosoftWin32API或/和Cygwin32API编写Win32控制台或
GUI应用程序;
?能够方便地从源代码中配置和建立许多GNU工具,包括GNUWin32开发工具
本身;
?可将许多重要的UNIX工具移植到WindowsNT而不用对源代码进行大规模修
改;
?包含有相当完整的UNIX环境工具,可使用许多普通的UNIX系统工具。
有关上述这两种软件,读者可访问如下站点:
http://www.softway.com/OpenNT/homet.htm
htt://www.cygus.com/misc/gnu.win32
和WindowsNT相反的是,Linux是一个POSIX.1标准的完全兼容系统。Linux上
的POSIX.2标准实现是由GNU工具和函数库提供的,其中最主要的C函数库是glibc。
该函数库包含如下内容:
?ISOC:C编程语言的国际标准。GNUC函数库与美国国家标准局(ANSI)公布
的C标准兼容。这一标准后来被国际标准化组织所接收(ISO/IEC9899:1990)。
?POSIX:操作系统的ISO/IEC9945(即IEEE1003)标准。GNUC函数库实现了
ISO/IEC9945-1:1996(POSIX系统应用程序编程接口,即POSIX.1)指定的
所有函数。该标准是对ISOC的扩展,包括文件系统接口原语、设备相关的终
端控制函数以及进程控制函数。同时,GUNC函数库还支持部分由ISO/IEC
9945-2:1993(POSIXShell和工具标准,即POSIX.2)指定的函数,其中包
括用于处理正则表达式和模式匹配的函数。
?BerkeleyUnix:BSD和SunOS。GNUC函数库定义了某些UNIX版本中尚未标
准化的函数,尤其是4.2BSD,4.3BSD,4.4BSDUnix系统(即“BerkeleyUnix”)
以及“SunOS”(大众化的4.2BSD变种,其中包含有某些UnixSystemV的功
能)。BSD函数包括符号链接、select函数、BSD信号处理函数以及套接字等
等。
?SVID:SystemV的接口描述。SystemV接口描述(SVID)是描述AT&TUnixSystem
V操作系统的文档,它是对POSIX标准的扩展超集。GNUC函数库定义了大多
数由SVID指定而未被ISOC和POSIX标准指定的函数。来自SystemV的
支持函数包括进程间通信和共享内存、hsearch和drand48函数族、fmtmsg以
及一些数学函数。
?XPG:X/Open可移植性指南。X/Open可移植性指南(由X/OpenCompany,Ltd.
出版),是比POSIX更为一般的标准。X/Open拥有Unix的版权,而XPG则
指定成为Unix操作系统必须满足的需求。GNUC函数库遵循X/Open可移植
性指南(Issue4.2)以及所有的XSI(X/Open系统接口)兼容系统的扩展,
同时也遵循所有的X/OpenUnix扩展。
同时,Linux也包含有许多字符界面管理、网络协议处理以及图形图象处理的函数库,
这些函数库均作为一般Linux商业发行版的一部分而一同发行。有关这些函数库的详细
介绍,读者可参阅附录C。
实际上,Microsoft并没有打算自己的操作系统做到与UNIX完全兼容,如果读者看
到过由微软(中国)有限公司编著的《MicrosoftSQLServer6.5技术参考》(科学出版
社、龙门书局1997年出版)一书,就可以明白微软和UNIX阵营的激烈竞争。既然
Microsoft在该书中说UNIX如何如何不好,当然就不会对来自UNIX的POSIX有什么
好的支持了。
那么,WindowsNT的操作系统接口包括哪些内容呢?
13.1.2WindowsNT的操作系统接口
WindowsNT的操作系统服务主要体现在Win32API上,大体可分为如下几类:
?窗口管理。应用程序可用来创建和管理窗口的部分,涉及到窗口、消息、消息
队列、控件、对话框、鼠标和键盘输入、定时器、菜单、键盘加速键以及其他
与窗口管理有关的内容。
?图形设备接口。应用程序用来实现设备无关图形的部分,涉及到设备描述表、
坐标转换、元文件、位图、图标、画刷、画笔、区域、直线和曲线、字体、颜
色、路径、剪切、打印等。
?系统服务。应用程序用来实现基本多任务管理的Win32API部分,涉及到进程
和线程、内存管理、网络、动态链接、安全性以及其他有关系统的内容。
?多媒体服务。Win32API中多媒体支持,涉及到音频、视频、媒体控制、多媒
体文件输入和输出以及增强的定时器功能等。
?扩展库。为Win32API额外增加的库,涉及到公用对话框、简化动态数据交换
(DDE)的管理函数、Shell中增强的拖放操作、文件安装函数以及数据解压缩
函数。
可明显看出,POSIX和Win32API是两个完全不同的操作系统接口体系。如果仅比较
这两个操作系统为用户提供的接口及函数库的话,可明显看到有如下特点:
?基于POSIX的操作系统接口部分比Win32的系统服务部分要简洁得多。POSIX的
接口函数大概只有二百多个;而Win32的系统服务部分的函数约有上千个,而
且调用接口相对复杂。
?Linux上除操作系统接口之外的函数库非常丰富。笔者曾经在MS-DOS、Windows
3.1、Windows95/NT下进行过C/C++的开发工作,当我接触到Linux时,发
现许多原来需要自己编写程序实现的功能,Linux上已经有的可用的函数库。
13.2VisualStudio和GNU
在WindowsNT上进行开发,用户主要使用的通用开发工具有:
?MicrosoftVisualStudio。该开发工具包是Microsoft最完整的开发工具包,
也是使用最为广泛的开发工具包,其中包含有VisualC++、VisualBasic、Visual
FoxPro等开发工具。这些工具一般是集成开发环境,利用这些工具,可在一个
程序中完成编辑、编译、调试等各项工作,对提高开发效率有帮助。
?BorlandC++。该工具是Borland公司的C/C++编译器,和VisualC++类似,
也是一个集成环境。
?BorlandDelphi。该工具是Borland公司开发的Pascal编译器,Borland公
司为了和VisualBasic竞争而开发,拥有较为广泛的用户群,也是一个集成
环境。
WindowsNT上的开发工具都有一个特点,它们均是一些集成开发工具。作为一个程
序员,笔者对集成开发环境是否能够真正提高开发效率,或者能够在多大程度上提高开发
效率保持怀疑态度。因为许多程序员并不使用集成的开发环境,但也同样富有效率。Linux
内核开发小组就是一个例子,在开发操作系统的时候,是无法使用集成开发工具的。使用
集成开发环境有一个缺点,就是容易让程序员养成懒惰的习惯。笔者就更加愿意在程序出
问题的时候去认真地分析程序,而不是一味依赖调试工具。
和WindowsNT上的集成开发环境不同,Linux上的开发工具是一些零散的GNU工
具。例如,程序员可能使用VIM编写程序,然后用make或gcc编译程序,如果程序有
错误,用gdb调试程序等。当然,也有一些集成的开发环境可以使用,例如xwpe(Window
ProgrammingEnvironment)就是一个集成开发环境。如果使用Emacs,程序员也可以借
助Emacs的强大配置能力为自己定制一个集成的开发环境。
Linux下的程序开发还有一个特点,就是可以借助许多脚本语言构造复杂的程序。例
如,程序员可借助Shell脚本编写处理文件、目录的脚本程序,也可以利用Perl
(PracticalExtractionReportLanguage)编写用来处理文本文件和生成报表的脚本程
序,还可以利用Tcl/Tk的脚本程序编写图形用户界面。如果恰当地使用这些脚本语言,
可以达到事半功倍的效果。在WindowsNT下,能够被称为脚本语言的大概算是VBA(Visual
BasicforApplication),但VBA仅在有限的应用软件中支持,例如,MicrosoftOffice,
而并不被操作系统支持。现在,Microsoft正打算将Perl的支持添加到它的操作系统中。
本章将简单介绍一些Linux下常见的开发工具以及有关Perl脚本编程的知识。由
于Tcl/Tk主要是用来编写图形用户界面的,我们将在下一章讲解Tcl/Tk的使用。
13.3Linux上的开发工具
13.3.1获取帮助
在Linux上,程序员获取帮助的最常用工具是man或xman。利用man或xman,
程序员可以查看特定函数的说明。例如,键入manprintf将显示printf函数的详细调
用接口。由于Linux上大部分软件开发工具都来自自由软件基金会的GNU项目,因此,
程序员可以使用另外一个程序获得有关开发工具使用的详细帮助信息,这一程序就是
info,它是GNU的超文本帮助系统。程序员可在命令行键入info进入info帮助系统,
也可在Emacs中键入Esc-x,info(或C-h,i)而进入info帮助系统。
在info中,在线帮助文本被组织成一个个节点(node),每个节点代表一个特定的
主题。屏幕上的第一行显示了该节点的标题,如图13-1所示。
(屏幕图)
图13-1在Emacs中访问info帮助系统
info帮助系统的初始屏幕显示了一个主题目录,你可以将光标移动到带有*的主题
菜单上面,然后按回车键进入该主题,也可以键入m,后跟主题菜单的名称而进入该主题。
例如,你可以键入m,然后再键入gcc而进入gcc主题中。
如果你要在主题之间跳转,则必须记住如下的几个命令键:
?n:跳转到该节点的下一个节点;
?p:跳转到该节点的上一个节点;
?m:指定菜单名而选择另外一个节点;
?f:进入交叉引用主题;
?l:进入该窗口中的最后一个节点;
?TAB:跳转到该窗口的下一个超文本链接;
?RET:进入光标处的超文本链接;
?u:转到上一级主题;
?d:回到info的初始节点目录;
?h:调出info教程;
?q:退出info。
13.3.2GNUC和C++编译器
Linux中最重要的软件开发工具是GCC。GCC是GNU的C和C++编译器。实际上,
GCC能够编译三种语言:C、C++和ObjectC(C语言的一种面向对象扩展)。利用gcc命
令可同时编译并连接C和C++源程序。
13.3.2.1GCC基本使用
利用GCC编译并连接少数几个C源文件是简单的。假设读者的一个程序只有一个源
文件hello.c,其内容如下:
#include<stdio.h>
#include<stdlib.h>
intmain()
{
printf("Hello,world!\n");
return0;
}
则只需在命令键入gcc-ohellohello.c就可以编译、连接并生成一个可执行文件
hello:
[WeiYM@versagcc]$gcc-ohellohello.c
[WeiYM@versagcc]$./hello
Hello,world!
如果你有两个或少数几个C源文件,也可以方便地利用GCC编译、连接并生成可执
行文件。例如,假设你有两个源文件main.c和factorial.c两个源文件,现在要编译
生成一个计算阶乘的程序。这两个源文件的内容如清单13-1和清单13-2所示。
清单13-1factorial.c
―――――――――――――――――――――――――――――――――――――――
#include<stdio.h>
#include<stdlib.h>
intfactorial(intn)
{
if(n<=1)
return1;
else
returnfactorial(n-1)*n;
}
―――――――――――――――――――――――――――――――――――――――
清单13-2main.c
―――――――――――――――――――――――――――――――――――――――
#include<stdio.h>
#include<stdlib.h>
intfactorial(intn);
intmain(intargc,char**argv)
{
intn;
if(argc<2){
printf("Usage:%sn\n",argv[0]);
return-1;
}
else{
n=atoi(argv[1]);
printf("Factorialof%dis%d.\n",n,factorial(n));
}
return0;
}
―――――――――――――――――――――――――――――――――――――――
利用如下的命令可编译生成可执行文件,并执行程序:
[WeiYM@versagcc]$gcc-ofactorialmain.cfactorial.c
[WeiYM@versagcc]$./factorial5
Factorialof5is120.
在上面的GCC命令选项中,使用了一个-o选项,该选项指定了编译/连接生成的输
出文件的名称。如果不指定该输出文件的名称,则GCC自动建立一个a.out文件。
我们也可以分别对上述两个文件进行编译,然后再连接起来,这时可使用GCC的-c选
项,如下所示:
[WeiYM@versagcc]$gcc-cmain.c
[WeiYM@versagcc]$gcc-cfactorial.c
[WeiYM@versagcc]$gcc-ofactorialmain.ofactorial.o
[WeiYM@versagcc]$./factorial10
Factorialof10is3628800.
13.3.2.2用GCC编译C++程序
GCC可同时用来编译C程序和C++程序。一般来说,C编译器通过源文件的后缀名
来判断是C程序还是C++程序。在Linux中,C源文件的后缀名为.c,而C++源文
件的后缀名为.C或.cpp。
但是,gcc命令只能编译C++源文件,而不能自动和C++程序使用的库连接。因此,
通常使用g++命令来完成C++程序的编译和连接,该程序会自动调用gcc实现编译。
假设我们有一个如下的C++源文件(hello.C):
#include<iostream.h>
voidmain(void)
{
cout<<"Hello,world!"<<endl;
}
则可以如下调用g++命令编译、连接并生成可执行文件:
[WeiYM@versagcc]$g++-ohellohello.c
[WeiYM@versagcc]$./hello
Hello,world!
13.3.2.3GCC的其他选项
gcc命令的基本语法是:
gccoptionsfilename
gcc的选项一般以减号(-)开头,有短的选项,例如上面看到的-o�%