什么是 Linux
Linux 是一个类 UNIX 内核的可以自由发布的实现版本,是一个操作系统的底层核心。几乎所有为 UNIX 编写的程序都可以在 Linux 上编译运行。
Linux 是由赫尔辛基大学的 Linus Torvalds 开发的,期间得到了因特网上广大 UNIX 程序员的帮助。它最初只是受 Andy Tanenbaum 教授的 Minix (一个小型类 UNIX 系统)启发而开发的个人爱好的程序,但后来逐步发展成为一个拥有自己版权的完整系统。其目的是,保证 Linux 除包含自由发布的代码外,不会集成任何私有代码 。
GNU 项目和自由软件基金会
Linux 社团支持自由软件的概念,即软件本身不应受限,它们应该遵守 GNU 通用公共许可证( GPL )。虽然获得软件可能要支付一定的费用,但此后就可以随意使用,并且它们通常是以源代码的形式发布的。
在 GPL 规则限制下,所有基于这种概念开发的软件都应遵循 GPL 。大家可以在 http://www.gnu.org 上找到更多关于自由软件的概念。
Linux 程序
Linux 应用程序表现为两种特殊类型的文件:可执行文件和脚本文件。可执行文件 是计算机可以直接运行的程序,它们相当于 Windows 中的 exe 文件。脚本文件 是一组指令的集合,这些指令将由另一个程序(解释器,比如 shell 或者 perl )来执行,它们相当于 Windows 中的 bat 文件、 cmd 文件或解释执行的 BASIC 程序。
与 Windows 相比, Linux 程序并不要求可执行程序或脚本具有特殊的文件名或扩展名。当登录 Linux 系统时,我们与一个 shell 程序(通常是 bash )进行交互,它像 Windows 中的命令提示窗口一样运行程序。在当前环境下,必定有一组环境变量与之匹配,其中 PATH 变量 指明了当前可以自动搜索的目录:当需要执行的程序在 PATH 指定的目录中时,你将不需指明待执行程序的全路径(除非有同名程序存在);否则必须指定需要执行程序的路径(相对路径或者绝对路径)。
如果你还是 Linux 环境下的初学者,一定要注意 Linux 使用正斜线( / ) 分割文件名里的目录名,而不是像 Windows 那样使用反斜线( / )。
建议 :如果你刚刚接触 Linux ,请先学会使用 Linux 再来学习如何在 Linux 环境下编程。
C 语言编译器
这里我们使用 GNU C 编译器,简称为 gcc 。因为它随 Linux 的发行版一起提供,并且它支持 ANSI C 的标准语法。在 http://www.gnu.org 上可以获取 gcc 软件包。
建议 :如果你是初学 C 语言,请编写经典的 HelloWorld 程序来开始你的学习之旅。
开发系统导引
对 Linux 开发人员来说,了解软件工具和开发资源在系统中存放的位置是很重要的。
应用程序 应用程序通常存放在系统为之保留的特定目录中。系统为正常使用提供的程序,包括用于程序开发的工具,都可以在目录 /usr/bin 中找到;系统管理员为某个特定的主机或本地网络添加的程序通常可在目录 /usr/local/bin 或 /opt 中找到。
建议 :在 /usr/local 目录结构下编译、运行自己的程序,并访问必须的文件。
头文件 对 C 语言来说,头文件几乎总是在 /usr/include 目录及其子目录下。那些依赖于特定 Linux 版本的头文件通常可以在目录 /usr/include/sys 和 /usr/include/linux 中找到。
在调用 C 语言编译器时,我们可以使用 -I 标志来包含保存在子目录或非标准位置中的头文件,比如: $ gcc –I/usr/openwin/include fred.c 。它指示编译器不仅在标准位置,也在 /usr/openwin/include 目录中查找 fred.c 中包含的头文件。
提示 :可以使用 grep 命令来搜索包含某些特定定义和函数原型的头文件。
库文件 库是一组预先编译好的函数的集合,这些函数都是按照可以重用的原则编写的。标准库文件一般存储在 /lib 和 /usr/lib 目录中。
库文件的名字总是以 lib 开头,随后的部分指明这是什么库(比如, libm 就代表了数学库)。文件名的最后部分以 . 开始,然后给出库文件的类型: .a 代表传统的静态函数库; .so 代表共享函数库。
提示 :如何编写及使用两种函数库可以参看《精通 UNIX 下 C 语言编程及项目实践》的 学习笔记 1 。