第一章Linux下C语言开发环境 学习笔记
1.2开发初步
1.2.1 Linux下C程序标准
ANSI C标准
POSIX标准
1.2.2 库函数和系统调用
- 库函数
用已完成常见的特定功能,可以应用于不同的平台而不需要做任何修改即具有极好的移植性。例如C函数库能够被绝大多数C编译器支持。 - 系统调用函数
一般与操作系统相关,不同的操作系统所使用的系统调用可能不同。一般来说如果两个操作系统差异很大,系统调用的可移植性不高。
3. glibc函数库
GNU的C函数库glibc是Linux最重要的函数库,它定义了ISO C标准指定的所有库函数,以及由POSIX 或其他UNIX操作系统变种制定的附加特色,还包括与GNU系统相关的扩展。
目前Linux系统大多使用glibc2.3以上的版本。
4.系统调用
系统调用是操作系统提供给外部程序的接口。在C语言中,操作系统的系统调用一般通过函数调用的形式完成。因为这些函数等装了系统调用的细节,将系统调用的入口、参数以及返回值用C语言的函数调用过程实现。
- 在Linux系统中,系统调用函数定义在glibc中。
系统调用需要注意以下几点:
(1)调用函数成功返回0值,不成功返回非零值。检查错误原因,要判断errno的值
(2)许多系统调用的返回数据通常通过引用参数传递。这时,需要在函数参数中传递缓冲区地址,返回的数据保存在缓冲区中。
(3)不能认为系统调用函数比其他函数的执行效率高。系统调用是一个非常耗时的过程。
1.2.3 在线文档
- man手册
- info手册
- HOW-TO
1.2.4获取错误信息
errno.h
打印错误信息:perror函数
1.3 部分常用工具
1.3.1 tar打包器
在Shell命令行下,可以使用的文件压缩工具有:gzip 、bzip2和zip
tar类型的文件是几个文件或目录在一个文件中的集合。用来创建备份和归档。tar使用的选项是有一下几项。
- -c
- -x
- -j
- -z
- -f
- -t
- -v
1.3.2常用命令及工具
- expand 用于将输入制表符转换为空格,unexpand将输入空格转换为制表符。
- grep搜索字符串
用来在指定文件中搜索关键字符串 - find查找文件
用于使用多种方式来查找某一文件的位置。 - AWK工具
用于处理文本的编程语言工具。 - sort命令
按照字母次序打印命令行上指定的文件内容,也接受用管道传送的输入。 - 其他命令
(1)nl命令用于为输出的每一行添加行号
(2)wc命令用于打印指定文件或输入流 《来自管道)中的行、字和字节的数量。
(3)head 命令用于打印文件或流的前十行。使用-n选项来指定应显示的行数。
(4)tail 命会用于打印文件或流的最后十行。使用-n选项指定应显示的行数。
(5) tac 与 cat 类似,但它以逆向顺序打印所有行,即先打印最后一行。
(6)paste 命会用于获取两个或更多文件作为输入,连接输入文件上的每个后续行,并输出结果行。它对于创建文本的表或列是很有用的。
(7)od命令用于将输入流转换为八进制或十六进制的 “转储”格式。 - 常用键盘组合键命令
- ^C:<ctrl-c>中断程序
- ctrl-\ :退出程序
- ctrl-S:结束程序
- ctrl-Z:挂起程序
1.4Linux下编码风格
1.4.1 GNU编码规范
- 函数开头的函数开头的左花括号放到最左边,避免把任何其他的左花括号、左括号或者左方招
号放到最左边。 - 尽力避免让两个不同优先级的操作符出现在相同的对齐方式中。
- 每个程序开头都应该有一段简短的说明其功能的注释。例如GNU emacs 上面的代码中的注释。
- 每个函数都加上注释,以说明函数做了些什么,需要哪些种类的参数,参数可能值的含义以及用途。
- 不要跨行声明多个变量。在每一行中都以一个新的声明开头。
- 要在同一个声明中同时说明结构标识和变量,或者结构标识和类型定义(typedef)尽量避免在 f的条件中进行赋值。
- 当在一个if语句中嵌套了另一个 if-else 语句时,应用花括号把if-else 括起来。
- 在名字中使用下划线以分隔单词,尽量使用小写;在宏或者枚举中通常使用大写常量
- 使用一个命令行选项时,给出的变量应该在选项含义的说明之后,而不是选项字符之后。
除了 vim 和 emacs 以外,还有indent工具可以帮程序员美化 C/C++源代码。
下面用这条命令可将 Liux 内核编程风格的程序 quan.c 转变为 GNU 编程风格。
[root@localhost~] #$ indent -gnu quan.c
1.4.2Linux内核编码规范
Linux 内核代码具有如下风格:
- 缩进采用 tab 制表符。
- 在 if 或者 for 循环中,将开始的大括号放在一行的最后,而将结束大括号放在本段语句结束行的第一位,函数中的大括号除外。
- 变量命名尽量使用简短的名字,简写或者单词间采用了_隔开,比如代码中的sys_cfg_data。
- 函数最好短小精悍,一个函数最好只做一件事情,而且函数中的变量一般不超过 10个,大小一般都小于 80 行。
- 一个模块的注释一般注明了作者、版权、注释说明代码的功能,而不是说明其实现原理,这也和 Linux 的文化有关。
以上是 GNU 编码风格和 Linux 内核编码风格,两种风格体现着两种不同的文化精神,有些地方相似,有些地方迥然不同,。读者可以根据个人情况选择其中一种编码规范来编写自己的程序。