自己开发所感兴趣的一些资料,整理于网络
1 ) Linux 程序开发的一些基础概念
在设置 Linux 的系统路径时,使用冒号分隔每个路径名。如 :
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11"
在 Linux 中的程序有两种,一种是可执行程序,与 Windows 下的 .exe 文件类似,一种是脚本,与 Windows 下的 .bat 文件类似。
Linux 中常用的程序存放路径有以下几个:
/bin ,该路径存放系统启动时需要使用的程序。
/usr/bin ,该路径存放用户需使用的标准程序。
/usr/local/bin ,该路径存放本地安装的程序。
Linux 使用斜杠 "/" 分隔路径名,而不是 Windows 的反斜杠 "/" 。
Linux 下的 C 编译器使用 GCC ,由于历史的原因,在 POSIX 兼容的操作系统中, C 编译器都叫 cc ,所以 Linux 下也有一个 cc 命令,它是一个到 gcc 的软链接。
开发工具,多数位于 /usr/bin 或 /usr/local/bin 目录下。
头文件,位于 /usr/include 目录。头文件包含有常量定义、系统调用和库函数调用的声明。这是系统默认的头文件存放路径,在编译程序时,编译器会自动查找该目录。 gcc 编译器在编译程序时也可用 -I 参数指定另外的头文件路径。如:
gcc -I/usr/local/myinclude test.c 。
库文件,库是一组已编译的函数集合,可方便我们重用代码。默认存放在 /lib 和 /usr/lib 目录。库文件可分为静态和共享两类。
.a ,静态库文件。使用静态库将会把所有的库代码引入程序,占用更多的磁盘空间和内存空间,所以一般建议使用共享库。
.so ,共享库文件。使用共享库的程序不包含库代码,只在程序运行才调用共享库中的代码。
在编译时可用包含路径的库文件名或用 -l 参数指定使用的库文件, /usr/lib/libm.a 等价于 -lm 。如 :
gcc -o hello hello.c /usr/lib/libm.a
或用 -l 参数写成
gcc -o hello hello.c -lm
如果我们要使用的库文件不在默认位置,在编译程序时可用 -L 参数指定库文件的路径。下面例子使用了 /usr/hello/lib 目录下的 libhello 库文件:
gcc -o hello -L/usr/hello/lib hello.c -lhello
创建和使用静态库。
一、工具的使用
1 、学会使用 vim/emacs , vim/emacs 是 linux 下最常用的源码编辑具,不光要学会用它们编辑源码,还要学会用它们进行查找、定位、替换等。新手的话推荐使用 vim ,这也是我目前使用的文本编辑器。
2 、学会 makefile 文件的编写规则,并结合使用工具 aclocal 、 autoconf 和 automake 生成 makefile 文件。
3 、掌握 gcc 和 gdb 的基本用法。掌握 gcc 的用法对于构建一个软件包很有益处,当软件包包含的文件比较多的时候,你还能用 gcc 把它手动编译出来,你就会对软件包中各个文件间的依赖关系有一个清晰的了解。
4 、掌握 svn/cvs 的基本用法。这是 linux ,也是开源社区最常用的版本管理系统。可以去试着参加 sourceforge 上的一些开源项目。
二、 linux/unix 系统调用与标准 C 库
系统调用应用软件与操作系统的接口,其重要性自然不用说,一定要掌握。推荐学习资料为 steven 先生的 UNIX 环境高级编程 ( 简称 APUE) 。
三、库的学习
无论是在哪个平台做软件开发,对于库的学习都很重要, linux 下的开发库很多,我主要介绍一下我常常用到的一些库。
1 、 glib 库
glib 库是 gtk+ 和 gnome 的基础库,并具是跨平台的,在 linux 、 unix 和 windows 下都可以用。 glib 库对于 linux 平台开发的影响就像 MFC 对 windows 平台开发的影响一样,很多开源项目都大量的使用了 glib 库,包括 gimp 、 gnome 、 gaim 、 evolution 和 linux 下的集群软件 heartbeat. 因为 glib 库自带有基本的数据结构实现,所以在学习 glib 库的时候可以顺便学习一下基本的数据结构 ( 包括 链表、树、队列和 hash 表 ) 。
2 、 libxml 库
libxml 是 linux 平台下解析 XML 文件的一个基础库,现在很多实用软件都用 XML 格式的配置文件,所以也有必要学习一下。
3 、 readline 库
readline 库是 bash shell 用的库,如果要开发命令行程序,那么使用 readline 库可以减少很多工作量,比如 bash 里的命令行自动补全,在 readline 里就已经 有实现,当然你也可以用自己的实现替代库的行为。 readline 库有很多网站介绍的,只要 google 一下 readline 就可以找到一堆了。
4 、 curses 库
curses 库以前是 vi 程序的一部分,后来从 vi 里提取出来成为一个独立的库。 curses 库对于编写终端相关的程序特别有用,比如要在终端某一行某一列定位输出, 改变终端字体的颜色和终端模式。 linux 下的 curses 库用的是 GNU 实现的 ncurses(new curses 的意思 ) 。
5 、 gtk+ 和 KDE 库
这两个库是开发 GUI 应用程序的基础库,现在 linux 下的大部份 GUI 程序都是基于这两个库开发的,对于它们 的学习也是很有必要的。
6 、 libnet
非常好的网络程序开发库,包括入侵检测等
四、网络的学习
网络这个东西太宽了,推荐学习资料 steven 先生的 UNIX 网络编程 ( 简称 UNP) 和 TCP/IP 协议详解,更进一步的话可以学习使用 libnet 编写网络程序。
在 Unix 系统平台上的网 络安全工具开发中,目前最为流行的 C API library 有 libnet 、 libpcap 、 libnids 和 libicmp 等。它们分别从不同层次和角度提供了不同的功能函数。使网络开发人员能够 忽略网络底层细节的实现,从而专注于程序本身具体功能的设计与开发。其中,
* libnet 提供的接口函数主要实现和封装了数据包的构造和发送过程。
* libpcap 提供的接口函数主要实现和封装了与数据包截获有关的过程。
* libnids 提供的接口函数主要实现了开发网络入侵监测系统 所必须的一些结构框架。
* libicmp 等相对较为简单,它封装的是 ICMP 数据包的主要处理过程 ( 构造、发送、接收等 ) 。
利用这些 C 函数库的接口,网络安全工具开发人员可以很方便地编写出具有结构化强、健壮性好、可移植性高等特点的程序,如 scanner 、 sniffer 、 firewall 、 IDS 等。