《linux下c编程常识.pdf》由会员分享,可在线阅读,更多相关《linux下c编程常识.pdf(8页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、linux 下 c 编程常识 目录目录 主要内容:.2 一:标准(ANSI C,POSIX,SVID,XPG,.).2 二:函数库和系统调用.3 三:在线文档(man,info,HOW-TO,.).4 四:C 语言编程风格.6 五:库和头文件的保存位置.7 六:共享库及其相关配置.8 主要内容:主要内容:标准(ANSI C,POSIX,SVID,XPG,.)函数库和系统调用 在线文档(man,info,HOW-TO,.)C 语言编程风格 库和头文件的保存位置 共享库及其相关配置 一:一:标准标准(ANSI C,POSIX,SVID,XPG,.)ANSI C:这一标准是 ANSI(美国国家标准局
2、)于 1989 年制定的 C 语言标准。后来被 ISO(国际标准化组织)接受为标准,因此也称为 ISO C。ANSI C 的目标是为各种操作系统上的 C 程序提供可移植性保证,而不仅仅限于 UNIX。该标准不仅定义了 C 编程语言的语发和语义,而且还定义了一个标准库。这个库可以根据 头文件划分为 15 个部分,其中包括:字符类型()、错误码()、浮点常数()、数学常数()、标准定义()、标准 I/O()、工具函数()、字符串操作()、时间和日期()、可变参数表()、信号()、非局部跳转()、本地信息()、程序断言()等等。POSIX:该标准最初由 IEEE 开发的标准族,部分已经被 ISO 接
3、受为国际标准。POSIX.1 和 POSIX.2 分别定义了 POSIX 兼容操作系统的 C 语言系统接口 以及 shell 和工具标准。这两个标准是通常提到的标准。SVID:System V 的接口描述。System V 接口描述(SVID)是描述 AT&;T Unix System V 操作 系统的文档,是对 POSIX 标准的扩展超集。XPG:X/Open 可移植性指南。X/Open 可移植性指南(由 X/Open Company,Ltd.出版),是比 POSIX 更为一般的标准。X/Open 拥有 Unix 的版权,而 XPG 则指定成为 Unix 操作系统必须满足的要求。二二:函数库
4、和系统调用:函数库和系统调用 1.glibc 众所周知,C 语言并没有为常见的操作,例如输入/输出、内存管理,字符串操作等提供内置的支持。相反,这些功能一般由标准的“函数库”来提供。GNU 的 C 函数库,即 glibc,是 Linux 上最重要的函数库,它定义了 ISO C 标准指定的所有的库函数,以及由 POSIX 或其他 UNIX 操作系统统变种指定的附加特色,还包括有与 GNU 系统相关的扩展。目前,流行的 Linux 系统使用 glibc 2.0 以上的版本。glibc 基于如下标准:ISO C:C 编程语言的国际标准,即 ANSI C。POSIX:GNU C 函数库实现了 ISO/
5、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
6、Unix”)以及“SunOS”(流行的 4.2 BSD 变种,其中包含有某些 Unix System V 的功能)。BSD 函数包括 符号链接、select 函数、BSD 信号处理函数以及套接字等等。SVID:System V 的接口描述。GNU C 函数库定义了大多数由 SVID 指定而未被 ISO C 和 POSIX 标准指定的函数。来自 System V 的支持函数包括进程间通信和共享内存、hsearch 和 drand48 函数族、fmtmsg 以及一些数学函数。XPG:X/Open 可移植性指南。GNU C 函数库遵循 X/Open 可移植性指南(Issue 4.2)以及所有的 XS
7、I(X/Open 系统接口)兼容系统的扩展,同时也遵循所有的 X/Open Unix 扩展。众所周知,C 语言并没有为常见的操作,例如输入/输出、内存管理,字符串操作等提供内置的支持。相反,这些功能一般由标准的“函数库”来提供。GNU 的 C 函数库,即 glibc,是 Linux 上最重要的函数库,它定义了 ISO C 标准指定的所有的库函数,以及由 POSIX 或其他 UNIX 操作系统统变种指定的附加特色,还包括有与 GNU 系统相关的扩展。目前,流行的 Linux 系统使用 glibc 2.0 以上的版本。glibc 基于如下标准:2.其他重要函数库 除 glibc 之外,流行的 Li
8、nux 发行版中还包含有一些其他的函数库,这些函数库具有重要地位,例如:GNU Libtool:GNU Libtool 实际是一个脚本生成工具,它可以为软件包开发者提供一般性 的共享库支持。以前,如果源代码包的开发者要利用共享库的优点,则必须为每个软件包可支持的平台编写 定制的支持代码。并且还需要设计配置接口,以便软件包的安装程序能够正确选择要建立的 库类型。利用 GNU Libtool,则可以简化开发者的这一工作。它在一个单独的脚本中同时封装 了与平台相关的依赖性以及用户界面。GNU Libtool 可使每个宿主类型的完整功能可通过 一般性的接口获得,同时为程序员隐藏了宿主的特殊性。GNU
9、Libtool 一致性接口是可靠的,用户不必阅读那些晦涩的文档,以便在每个平台上建立共享库。他们只需运行软件包的配置 脚本,而由 libtool 完成繁复的工作。CrackLib:CrackLib 为用户提供了一个 C 语言函数接口,利用这一函数,可避免用户选择 容易破解的密码。该函数库可在类似 passwd 的程序中使用。LibGTop:LibGTop 是一个能够获取进程信息以及系统运行信息的函数库,这些信息包括:系统的一般信息、SYS V IPC 限制、进程列表、进程信息、进程映射、文件系统使用信息等。图形文件操作函数库:包括 libungif、libtiff、libpng、Imlib 等
10、,可分别用来操作 GIF、TIFF、PNG 以及其他一些格式图形文件。3.系统调用 系统调用是操作系统提供给外部程序的接口。在 C 语言中,操作系统的系统调用通常通过函数调用的形式完成,这是因为这些函数封装了系统调用的细节,将系统调用的入口、参数以及返回值用 C 语言的函数调用过程实现。在 Linux 系统中,系统调用函数定义在 glibc 中。谈到系统调用时,需要注意如下几点:系统调用函数通常在成功时返回 0 值,不成功时返回非零值。如果要检查失败原因,则 要判断 errno 这个全局变量的值,errno 中包含有错误代码。许多系统调用的返回数据通常通过引用参数传递。这时,需要在函数参数中传
11、递一个 缓冲区地址,而返回的数据就保存在该缓冲区中。不能认为系统调用函数就要比其他函数的执行效率高。要注意,系统调用是一个非常耗时 的过程。有关系统调用我们将在以后详细讲述。三:三:在线文档在线文档(man,info,HOW-TO,.)1.man man,即 manunal,是 UNIX 系统手册的电子版本。根据习惯,UNIX 系统手册通常分为不同的部分(或小节,即 section),每个小节阐述不同的系统内容。目前的小节划分如下:命令:普通用户命令 系统调用:内核接口 函数库调用:普通函数库中的函数 特殊文件:/dev 目录中的特殊文件 文件格式和约定:/etc/passwd 等文件的格式
12、游戏。杂项和约定:标准文件系统布局、手册页结构等杂项内容 系统管理命令。内核例程:非标准的手册小节。便于 Linux 内核的开发而包含 其他手册小节:l:PostgreSQL 数据库命令 n:TCL/TK 命令 手册页一般保存在/usr/man 目录下,其中每个子目录(如 man1,man2,.,manl,mann)包含不同的手册小节。使用 man 命令查看手册页。man 命令行:man-acdfFhkKtwW-m system-p string-C config_file-M path-P pager-S section_list section name 常用命令行:$man open$m
13、an 7 man$man./myman.3 2.info Linux 中的大多数软件开发工具都是来自自由软件基金会的 GNU 项目,这些工具软件件的在线文档都以 info 文件的形式存在。info 程序是 GNU 的超文本帮助系统。info 文档一般保存在/usr/info 目录下,使用 info 命令查看 info 文档。要运行 info,可以在 shell 提示符后输入 info,也可以在 GNU 的 emacs 中键入 Esc-x 后跟 info。info 帮助系统的初始屏幕显示了一个主题目录,你可以将光标移动到带有*的主题菜单上面,然后按回车键 进入该主题,也可以键入 m,后跟主题菜单
14、的名称而进入该主题。例如,你可以键入 m,然后再键入 gcc 而进 进入 gcc 主题中。如果你要在主题之间跳转,则必须记住如下的几个命令键:*n:跳转到该节点的下一个节点;*p:跳转到该节点的上一个节点;*m:指定菜单名而选择另外一个节点;*f:进入交叉引用主题;*l:进入该窗口中的最后一个节点;*TAB:跳转到该窗口的下一个超文本链接;*RET:进入光标处的超文本链接;*u:转到上一级主题;*d:回到 info 的初始节点目录;*h:调出 info 教程;*q:退出 info。#DEMO#3.HOW-TO 可供用 户参考 的联机 文档 的另一 种形 式是 HOWTO 文 件,这 些文件 位
15、于 系统的/usr/doc/HOWTO 目录下。HOWTO 文件的文件名都有一个-HOWTO 后缀,并且都是文本文件。每一个 HOWTO 文件包含 Linux 某一方面的信息,例如它支持的硬件或如何建立一个引导盘。要想查看这些文件,进入/usr/doc/HOWTO 目录,使用 more 命令,具体形式如下:$cd/usr/doc/HOWTO;more topic-name-HOWTO 另 外,HOWTO 文 档 还 有 其 他 格 式 的 文 件,例 如 HTML 和 PS 等,保 存 在/usr/doc/HOWTO/other-formats 下。4.其他 Linux 的内核文档一般包含在内
16、核源代码中,目录如下:/usr/src/linux-2.x.x/Documentation /usr/doc 目录下包含有大量与特定软件或函数库相关的说明性文档。四:四:C 语言编程风格语言编程风格 编写这一小节的目的是提醒大家在编程过程中注意编程风格。如果你只是在编写一些小的练习程序,程序只有一两百行长的话,编程风格可能并不重要。然而,如果你和许多人一起进行开发工作,或者,你希望在过一段时间之后,还能够正确理解自己的程序的话,就必须养成良好的编程习惯。在诸多编程习惯当中,编程风格是最重要的一项内容。良好的编程风格可以在许多方面帮助开发人员。如果你阅读过 Linux 内核源代码的话,可能会对程
17、序的优美编排所倾倒。良好的编程风格可以增加代码的可读性,并帮助你理清头绪。如果程序非常杂乱,大概看一眼就该让你晕头转向了。编程风格最能体现一个程序员的综合素质。许多读者可能对 Windows 所推崇的匈牙利命名法很熟悉。这种方法定义了非常复杂的函数、变量、类型等的命名方法,典型的命名方法是采用大小写混写的方式,对于变量名称,则采用添加前缀的办法来表示其类型,例如:char szBuffer20;int nCount;利用 sz 和 n 分别代表字符串和整数。为了表示一个变量名称,采用如下的变量名称是可能的:int iThisIsAVeryLongVariable;在 Linux 中,我们经常看
18、到的是定义非常简单的函数接口和变量名称。在 Linux 内核的源代码中,可以看到 Linux 内核源代码的编码风格说明(/Documentation/CodingStyle)。UNIX 系统的一个特点是设计精巧,并遵守积木式原则。C 语言最初来自 UNIX 操作系统,与 UNIX 的设计原则一样,C 语言被广泛认可和使用的一个重要原因是它的灵活性以及简洁性。因此,在利用 C 语言编写程序时,始终应当符合其简洁的设计原则,而不应当使用非常复杂的变量命名方法。Linus 为 Linux 内核定义的 C 语言编码风格要点如下:缩进时,使用长度为 8 个字符宽的 Tab 键。如果程序的缩进超过 3 级
19、,则应考虑重新设计程序。大括号的位置。除函数的定义体外,应当将左大括号放在行尾,而将右大括号放在行首。函数的定义体应将左右大括号放在行首。如下所示:int function(int x,int y)if(x=y).else if(x y).else .return 0;应采用简洁的命名方法。对变量名,不赞成使用大小写混写的形式,但鼓励使用描述性的名称;尽可能不使用全局变量;不采用匈牙利命名法表示变量的类型;采用短小精悍的名称表示局部变量;保持函数短小,从而避免使用过多的局部变量。保持函数短小精悍。不应过分强调注释的作用,应尽量采用好的编码风格而不是添加过多的注释。五:五:库和头文件的保存位置库和头文件的保存位置 1.函数库/lib:系统必备共享库/usr/lib:标准共享库和静态库 /usr/i486-linux-libc5/lib:libc5 兼容性函数库 /usr/X11R6/lib:X11R6 的函数库/usr/local/lib:本地函数库 2.头文件 /usr/include:系统头文件 /usr/local/include:本地头文件 六:共享库及其相关配置六:共享库及其相关配置 /etc/ld.so.conf:包含共享库的搜索位置 ldconfig:共享库管理工具,一般在更新了共享库之后要运行该命令 ldd:可查看可执行文件所使用的共享库
限制150内