SunBo

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

BBS水木清华站∶精华区

发信人: Kongming (没日没夜...), 信区: Linux        
标  题: Re: 如何学习linux下编程? 
发信站: BBS 水木清华站 (Mon Aug  2 11:27:04 1999) 
 
我为你贴一篇文章吧,简要介绍了 Linux 下的编程工具, 
入门是没有问题的。 
 
这是我最近编写的书的部分内容。 
 
严正声明: 
本文由 Kongming 网友享有专有版权。 
版权所有,未经许可,不准随意复制、改编或变相改编、扩散。 
 
主要包含如下内容: 
? GNU C、C++ 编译器 
? GNU make 工具 
? GNU 的调试器 
? RCS 版本控制系统 
并简单介绍了 Linux 系统上广为流行的 Perl 脚本语言。 
对比了 Linux 和 Windows NT 两种不同的编码风格。 
 
在 BBS 上看有些困难,拿回家慢慢看吧。 
 
 
 
第十三章  软件开发 
由于操作系统只是一个工具,对大多数读者来说,学习操作系统的最终目的是利用操 
作系统上的应用软件完成自己的工作,或者利用开发工具开发应用程序。因此,对一个操 
作系统来说,可获得的开发工具,以及这些开发工具是否有效,就成为评价操作系统的一 
个重要因素。 
这一部分的后三章将主要从开发人员的角度比较 Linux 和 Windows NT。本章的主要 
内容如下: 
? 介绍操作系统为开发人员提供的各种系统服务; 
? 介绍操作系统上的主要开发工具。 
考虑到许多读者可能对 Linux 上的开发工具了解不多,因此,本章将介绍一些 Linux  
上常用的开发工具。当然,软件开发并不是区区一章就能够讲得清楚的,更多的需要读者 
自己去实践。 
13.1  POSIX 标准和操作系统接口 
13.1.1  Linux 和 Windows NT 对 POSIX 标准的支持 
从第一章的内容我们知道,POSIX 是一种标准,主要定义了操作系统的系统调用接口, 
POSIX 标准最初为提高 UNIX 系统之间的移植性而开发。Linux 是一种 POSIX 兼容系统, 
而 Windows NT 中包含了 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 标准;而 Windows NT 只提供对 POSIX.1 的支持,而且是一个不完 
整的系统,许多方面(例如 I/O)需要 Win32 API 来完成。实际上,Windows NT 的许多  
POSIX.1 接口是通过 Win32 API 间接实现的。 
Windows NT 中的 POSIX.1 版本基本上没有什么用处,在 Visual Studio 6.0 中, 
甚至取消了对 POSIX.1 的支持。如果读者要在 Windows NT 上进行一些 POSIX 的开发工 
作,建议不要使用 Windows NT POSXI.1。用户可以使用第三方POSIX 系统,或者由 GNU 提 
供的 GNU Win32 工具。这些产品提供了更强大的功能,例如 Software System Inc. 的  
POSIX.2 工具箱(OpenNT)具有如下特征:真正的 UNIX Shell,以及在 Windows NT 中 
运行 X Window 的能力等。这些软件为 Windows NT 的非完整 POSIX.1 系统增加了如下 
特性: 
? POSIX.1、POSIX.2 和 ANSI C 接口; 
? 可在 Intel 和 Alpha 平台上使用; 
? BSD 套接字支持; 
? System V 的共享内存和信号灯 IPC 机制; 
? X11R5 客户、库和头文件; 
? OPENNTIF(OSF/Motif 1.2.4 窗口管理器和开发库); 
? Color curses库; 
? 完整的 Shell 作业管理; 
? 磁带设备支持; 
? UNIX 开发工具:make、rcs、yacc、lex、cc、c89、nm、ar、strip 等。 
GNU Win32 是针对 x86 和 PowerPC 的 Windows NT/95 的 GNU 开发工具。使用这些 
开发工具开发的应用程序能够访问 Microsoft Win32 API,也能访问 Cygwin32 API,它 
提供了附加的类似 UNIX 的功能,包括 UNIX 套接字和进程控制等。利用这些工具,可增 
强 Windows NT 上 POSIX 子系统: 
? 利用标准的 Microsoft Win32 API 或/和 Cygwin32 API 编写 Win32 控制台或  
GUI应用程序; 
? 能够方便地从源代码中配置和建立许多 GNU 工具,包括 GNU Win32 开发工具 
本身; 
? 可将许多重要的 UNIX 工具移植到 Windows NT 而不用对源代码进行大规模修 
改; 
? 包含有相当完整的 UNIX 环境工具,可使用许多普通的 UNIX 系统工具。 
有关上述这两种软件,读者可访问如下站点: 
http://www.softway.com/OpenNT/homet.htm 
htt://www.cygus.com/misc/gnu.win32 
和 Windows NT 相反的是,Linux 是一个 POSIX.1标准的完全兼容系统。Linux 上 
的 POSIX.2 标准实现是由 GNU 工具和函数库提供的,其中最主要的 C 函数库是 glibc。 
该函数库包含如下内容: 
? ISO C:C 编程语言的国际标准。GNU C 函数库与美国国家标准局(ANSI)公布 
的 C 标准兼容。这一标准后来被国际标准化组织所接收(ISO/IEC 9899:1990)。 
? POSIX:操作系统的 ISO/IEC 9945(即 IEEE 1003)标准。GNU C 函数库实现了  
ISO/IEC 9945-1:1996 (POSIX 系统应用程序编程接口,即 POSIX.1)指定的 
所有函数。该标准是对 ISO C 的扩展,包括文件系统接口原语、设备相关的终 
端控制函数以及进程控制函数。同时,GUN C 函数库还支持部分由 ISO/IEC  
9945-2:1993(POSIX Shell 和 工具标准,即 POSIX.2)指定的函数,其中包 
括用于处理正则表达式和模式匹配的函数。 
? Berkeley Unix:BSD 和 SunOS。GNU C 函数库定义了某些 UNIX 版本中尚未标 
准化的函数,尤其是 4.2 BSD, 4.3 BSD, 4.4 BSD Unix 系统(即“Berkeley Unix”) 
以及“SunOS”(大众化的 4.2 BSD 变种,其中包含有某些Unix System V 的功 
能)。BSD 函数包括符号链接、select 函数、BSD 信号处理函数以及套接字等 
等。 
? SVID:System V 的接口描述。System V 接口描述(SVID)是描述 AT&T Unix System  
V 操作系统的文档,它是对 POSIX 标准的扩展超集。GNU C 函数库定义了大多 
数由 SVID 指定而未被 ISO C 和 POSIX 标准指定的函数。来自 System V 的 
支持函数包括进程间通信和共享内存、hsearch 和 drand48 函数族、fmtmsg 以 
及一些数学函数。 
? XPG:X/Open 可移植性指南。X/Open 可移植性指南(由 X/Open Company, Ltd. 
出版),是比 POSIX 更为一般的标准。X/Open 拥有 Unix 的版权,而 XPG 则 
指定成为 Unix 操作系统必须满足的需求。GNU C 函数库遵循 X/Open 可移植 
性指南(Issue 4.2)以及所有的 XSI(X/Open 系统接口)兼容系统的扩展, 
同时也遵循所有的 X/Open Unix 扩展。 
同时,Linux 也包含有许多字符界面管理、网络协议处理以及图形图象处理的函数库, 
这些函数库均作为一般 Linux 商业发行版的一部分而一同发行。有关这些函数库的详细 
介绍,读者可参阅附录 C。 
实际上,Microsoft 并没有打算自己的操作系统做到与 UNIX 完全兼容,如果读者看 
到过由微软(中国)有限公司编著的《Microsoft SQL Server 6.5 技术参考》(科学出版 
社、龙门书局 1997 年出版)一书,就可以明白微软和 UNIX 阵营的激烈竞争。既然  
Microsoft 在该书中说 UNIX 如何如何不好,当然就不会对来自 UNIX 的 POSIX 有什么 
好的支持了。 
那么,Windows NT 的操作系统接口包括哪些内容呢? 
13.1.2  Windows NT 的操作系统接口 
Windows NT 的操作系统服务主要体现在 Win32 API 上,大体可分为如下几类: 
? 窗口管理。应用程序可用来创建和管理窗口的部分,涉及到窗口、消息、消息 
队列、控件、对话框、鼠标和键盘输入、定时器、菜单、键盘加速键以及其他 
与窗口管理有关的内容。 
? 图形设备接口。应用程序用来实现设备无关图形的部分,涉及到设备描述表、 
坐标转换、元文件、位图、图标、画刷、画笔、区域、直线和曲线、字体、颜 
色、路径、剪切、打印等。 
? 系统服务。应用程序用来实现基本多任务管理的 Win32 API 部分,涉及到进程 
和线程、内存管理、网络、动态链接、安全性以及其他有关系统的内容。 
? 多媒体服务。Win32 API 中多媒体支持,涉及到音频、视频、媒体控制、多媒 
体文件输入和输出以及增强的定时器功能等。 
? 扩展库。为 Win32 API 额外增加的库,涉及到公用对话框、简化动态数据交换 
(DDE)的管理函数、Shell 中增强的拖放操作、文件安装函数以及数据解压缩 
函数。 
可明显看出,POSIX 和 Win32API 是两个完全不同的操作系统接口体系。如果仅比较 
这两个操作系统为用户提供的接口及函数库的话,可明显看到有如下特点: 
? 基于 POSIX 的操作系统接口部分比 Win32 的系统服务部分要简洁得多。POSIX 的 
接口函数大概只有二百多个;而 Win32 的系统服务部分的函数约有上千个,而 
且调用接口相对复杂。 
? Linux 上除操作系统接口之外的函数库非常丰富。笔者曾经在 MS-DOS、Windows  
3.1、Windows 95/NT 下进行过 C/C++ 的开发工作,当我接触到 Linux 时,发 
现许多原来需要自己编写程序实现的功能,Linux 上已经有的可用的函数库。 
13.2  Visual Studio 和 GNU 
在 Windows NT 上进行开发,用户主要使用的通用开发工具有: 
? Microsoft Visual Studio。该开发工具包是 Microsoft 最完整的开发工具包, 
也是使用最为广泛的开发工具包,其中包含有 Visual C++、Visual Basic、Visual  
FoxPro 等开发工具。这些工具一般是集成开发环境,利用这些工具,可在一个 
程序中完成编辑、编译、调试等各项工作,对提高开发效率有帮助。 
? Borland C++。该工具是 Borland 公司的 C/C++ 编译器,和 Visual C++ 类似, 
也是一个集成环境。 
? Borland Delphi。该工具是 Borland 公司开发的 Pascal 编译器,Borland 公 
司为了和 Visual Basic 竞争而开发,拥有较为广泛的用户群,也是一个集成 
环境。 
Windows NT 上的开发工具都有一个特点,它们均是一些集成开发工具。作为一个程 
序员,笔者对集成开发环境是否能够真正提高开发效率,或者能够在多大程度上提高开发 
效率保持怀疑态度。因为许多程序员并不使用集成的开发环境,但也同样富有效率。Linux  
内核开发小组就是一个例子,在开发操作系统的时候,是无法使用集成开发工具的。使用 
集成开发环境有一个缺点,就是容易让程序员养成懒惰的习惯。笔者就更加愿意在程序出 
问题的时候去认真地分析程序,而不是一味依赖调试工具。 
和 Windows NT 上的集成开发环境不同,Linux 上的开发工具是一些零散的 GNU 工 
具。例如,程序员可能使用 VIM 编写程序,然后用 make 或 gcc 编译程序,如果程序有 
错误,用 gdb 调试程序等。当然,也有一些集成的开发环境可以使用,例如 xwpe(Window  
Programming Environment)就是一个集成开发环境。如果使用 Emacs,程序员也可以借 
助 Emacs 的强大配置能力为自己定制一个集成的开发环境。 
Linux 下的程序开发还有一个特点,就是可以借助许多脚本语言构造复杂的程序。例 
如,程序员可借助 Shell 脚本编写处理文件、目录的脚本程序,也可以利用 Perl 
(Practical Extraction Report Language)编写用来处理文本文件和生成报表的脚本程 
序,还可以利用 Tcl/Tk 的脚本程序编写图形用户界面。如果恰当地使用这些脚本语言, 
可以达到事半功倍的效果。在 Windows NT 下,能够被称为脚本语言的大概算是 VBA(Visual  
Basic for Application),但 VBA 仅在有限的应用软件中支持,例如,Microsoft Office, 
而并不被操作系统支持。现在,Microsoft 正打算将 Perl 的支持添加到它的操作系统中。 
本章将简单介绍一些 Linux 下常见的开发工具以及有关 Perl 脚本编程的知识。由 
于 Tcl/Tk 主要是用来编写图形用户界面的,我们将在下一章讲解 Tcl/Tk 的使用。 
13.3  Linux 上的开发工具 
13.3.1  获取帮助 
在 Linux 上,程序员获取帮助的最常用工具是 man 或 xman。利用 man 或 xman, 
程序员可以查看特定函数的说明。例如,键入 man printf 将显示 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.2  GNU C 和 C++ 编译器 
Linux 中最重要的软件开发工具是 GCC。GCC 是 GNU 的 C 和 C++ 编译器。实际上, 
GCC 能够编译三种语言:C、C++ 和 Object C(C 语言的一种面向对象扩展)。利用 gcc 命 
令可同时编译并连接 C 和 C++ 源程序。 
13.3.2.1  GCC 基本使用 
利用 GCC 编译并连接少数几个 C 源文件是简单的。假设读者的一个程序只有一个源 
文件 hello.c,其内容如下: 
#include <stdio.h> 
#include <stdlib.h> 
 
int main () 

    printf ("Hello, world!/n"); 
 
    return 0; 

则只需在命令键入 gcc -o hello hello.c 就可以编译、连接并生成一个可执行文件  
hello: 
[WeiYM@versa gcc]$ gcc -o hello hello.c 
[WeiYM@versa gcc]$ ./hello 
Hello, world! 
如果你有两个或少数几个 C 源文件,也可以方便地利用 GCC 编译、连接并生成可执 
行文件。例如,假设你有两个源文件 main.c 和 factorial.c 两个源文件,现在要编译 
生成一个计算阶乘的程序。这两个源文件的内容如清单 13-1 和清单 13-2 所示。 
清单 13-1  factorial.c 
――――――――――――――――――――――――――――――――――――――― 
#include <stdio.h> 
#include <stdlib.h> 
 
int factorial (int n) 

    if (n <= 1) 
        return 1; 
 
    else 
        return factorial (n - 1) * n; 

――――――――――――――――――――――――――――――――――――――― 
清单 13-2  main.c 
――――――――――――――――――――――――――――――――――――――― 
#include <stdio.h> 
#include <stdlib.h> 
 
 
int factorial (int n); 
 
int main (int argc, char **argv) 

    int n; 
 
    if (argc < 2) { 
        printf ("Usage: %s n/n", argv [0]); 
        return -1; 
    } 
    else { 
        n = atoi (argv[1]); 
        printf ("Factorial of %d is %d./n", n, factorial (n)); 
    } 
 
    return 0; 

――――――――――――――――――――――――――――――――――――――― 
利用如下的命令可编译生成可执行文件,并执行程序: 
[WeiYM@versa gcc]$ gcc -o factorial main.c factorial.c 
[WeiYM@versa gcc]$ ./factorial 5 
Factorial of 5 is 120. 
在上面的 GCC 命令选项中,使用了一个 -o 选项,该选项指定了编译/连接生成的输 
出文件的名称。如果不指定该输出文件的名称,则 GCC 自动建立一个 a.out 文件。 
我们也可以分别对上述两个文件进行编译,然后再连接起来,这时可使用 GCC 的 -c 选 
项,如下所示: 
[WeiYM@versa gcc]$ gcc -c main.c 
[WeiYM@versa gcc]$ gcc -c factorial.c 
[WeiYM@versa gcc]$ gcc -o factorial main.o factorial.o 
[WeiYM@versa gcc]$ ./factorial 10 
Factorial of 10 is 3628800. 
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> 
 
void main (void) 

    cout << "Hello, world!" << endl; 

则可以如下调用 g++ 命令编译、连接并生成可执行文件: 
[WeiYM@versa gcc]$ g++ -o hello hello.c 
[WeiYM@versa gcc]$ ./hello 
Hello, world! 
13.3.2.3  GCC 的其他选项 
gcc 命令的基本语法是: 
gcc options filename 
gcc 的选项一般以减号(-)开头,有短的选项,例如上面看到的 -o �%

posted on 2009-12-08 11:49  SunBo  阅读(4042)  评论(0编辑  收藏  举报