Linux 论文
contents
1、Instruction.....................................................................................................................................2
1.1 C language.............................................................................................................................2
1.1.1 发展历史 ..................................................................................................................2
1.1.2 语言标准 ..................................................................................................................2
1.1.3 语言特点 ..................................................................................................................3
1.1.4 C 语言的优缺点 ........................................................................................................4
1.2 C compiler .............................................................................................................................5
1.2.1 GCC 简介 ................................................................................................................... 5
1.2.2 GCC 基本用法 ........................................................................................................... 6
1.3 source....................................................................................................................................6
2、Methods ........................................................................................................................................6
2.1 Headfile.................................................................................................................................6
2.1.1 unistd.h 分析 .............................................................................................................7
2.1.2 stdio.h 分析 ..............................................................................................................7
2.1.3 dirent.h 分析 ............................................................................................................ 7
2.1.4 string.h 分析 .............................................................................................................7
2.1.5 sys/stat.h 分析 ..........................................................................................................8
2.1.6 stdlib.h 分析 ...........................................................................................................9
2.2Structure Variable..................................................................................................................9
3、Design......................................................................................................................................... 11
3.1 UML .....................................................................................................................................11
3.2 Logic analysis...................................................................................................................... 11
4、Programming.............................................................................................................................. 11
4.1 Main 函数 ...........................................................................................................................11
4.2 Function 函数 .....................................................................................................................13
5、Future work................................................................................................................................ 16
5.1 程序改进方案 ....................................................................................................................16
1、Instruction
1.1 C language
1.1.1 发展历史
C 语言之所以命名为 C,是因为 C 语言源自 Ken Thompson 发明的 B 语言,
而 B 语言则源自 BCPL 语言。
1967 年,剑桥大学的 Martin Richards 对 CPL 语言进行了简化,于是产生了
BCPL(Basic Combined Programming Language)语言。
20 世纪 60 年代,美国 AT&T 公司贝尔实验室(AT&T Bell Laboratory)的研究员
Ken Thompson 闲来无事,手痒难耐,想玩一个他自己编的,模拟在太阳系航行
的电子游戏——Space Travel。他背着老板,找到了台空闲的机器——PDP-7。但
这台机器没有操作系统,而游戏必须使用操作系统的一些功能,于是他着手为
PDP-7 开发操作系统。后来,这个操作系统被命名为——UNIX。
1970 年,美国贝尔实验室的 Ken Thompson,以 BCPL 语言为基础,设计出
很简单且很接近硬件的 B 语言(取 BCPL 的首字母)。并且他用 B 语言写了第一
个 UNIX 操作系统。
1971 年,同样酷爱 Space Travel 的 Dennis M.Ritchie 为了能早点儿玩上游戏,加
入了 Thompson 的开发项目,合作开发 UNIX。他的主要工作是改造 B 语言,使
其更成熟。[2]
1972 年,美国贝尔实验室的 D.M.Ritchie 在 B 语言的基础上最终设计出了一种
新的语言,他取了 BCPL 的第二个字母作为这种语言的名字,这就是 C 语言。
1.1.2 语言标准
1970 到 80 年代,C 语言被广泛应用,从大型主机到小型微机,也衍生了 C 语言
的很多不同版本。
1、c89 标准
1983 年,美国国家标准协会(ANSI)成立了一个委员会 X3J11,来制定 C 语言
标准。
1989 年,美国国家标准协会(ANSI)通过了 C 语言标准,被称为 ANSI X3.159-1989
"Programming Language C"。因为这个标准是 1989 年通过的,所以一般简称 C89
标准。有些人也简称 ANSI C,因为这个标准是美国国家标准协会(ANSI)发布
的。
2、c90 标准
1990 年,国际标准化组织(ISO)和国际电工委员会(IEC)把 C89 标准定为 C
语言的国际标准,命名为 ISO/IEC 9899:1990 - Programming languages -- C[5] 。
因为此标准是在 1990 年发布的,所以有些人把简称作 C90 标准。不过大多数人
依然称之为 C89 标准,因为此标准与 ANSI C89 标准完全等同。
3、C94 标准
1994 年,国际标准化组织(ISO)和国际电工委员会(IEC)发布了 C89 标准修
订版,名叫 ISO/IEC 9899:1990/Cor 1:1994[6] ,有些人简称为 C94 标准。
4、C95 标准
1995 年,国际标准化组织(ISO)和国际电工委员会(IEC)再次发布了 C89 标
准修订版,名叫 ISO/IEC 9899:1990/Amd 1:1995 - C Integrity[7] ,有些人简称为
C95 标准。
5、C99 标准
1999 年 1 月,国际标准化组织(ISO)和国际电工委员会(IEC)发布了 C 语言的
新标准,名叫 ISO/IEC 9899:1999 - Programming languages -- C [8] ,简称 C99 标
准。这是 C 语言的第二个官方标准。
1.1.3 语言特点
基本特性
1、高级语言:它是把高级语言的基本结构和语句与低级语言的实用性结合起来
的工作单元。
2、结构式语言:结构式语言的显著特点是代码及数据的分隔化,即程序的各个
部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便
于使用、维护以及调试。C 语言是以函数形式提供给用户的,这些函数可方便
的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。[10]
4、代码级别的跨平台:由于标准的存在,使得几乎同样的 C 代码可用于多种操
作系统,如 Windows、DOS、UNIX 等等;也适用于多种机型。C 语言对编写需
要进行硬件操作的场合,优于其它高级语言。[10]
5、使用指针:可以直接进行靠近硬件的操作,但是 C 的指针操作不做保护,也
给它带来了很多不安全的因素。C++在这方面做了改进,在保留了指针操作的同
时又增强了安全性,受到了一些用户的支持,但是,由于这些改进增加语言的
复杂度,也为另一部分所诟病。Java 则吸取了 C++的教训,取消了指针操作,也
取消了 C++改进中一些备受争议的地方,在安全性和适合性方面均取得良好的效
果,但其本身解释在虚拟机中运行,运行效率低于 C++/C。一般而言,C,C++,
java 被视为同一系的语言,它们长期占据着程序使用榜的前三名。[11]
特有特点
C 语言是一个有结构化程序设计、具有变量作用域(variable scope)以及递归功
能的过程式语言。
C 语言传递参数均是以值传递(pass by value),另外也可以传递指针(a pointer
passed by value)。
不同的变量类型可以用结构体(struct)组合在一起。
只有 32 个保留字(reserved keywords),使变量、函数命名有更多弹性。
部份的变量类型可以转换,例如整型和字符型变量。
通过指针(pointer),C 语言可以容易的对存储器进行低级控制。
预编译处理(preprocessor)让 C 语言的编译更具有弹性。
1.1.4 C 语言的优缺点
优点
1、简洁紧凑、灵活方便
C 语言一共只有 32 个关键字,9 种控制语句,程序书写形式自由,区分大小写。
把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以像汇
编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。
2、运算符丰富
C 语言的运算符包含的范围很广泛,共有 34 种运算符。C 语言把括号、赋值、
强制类型转换等都作为运算符处理。从而使 C 语言的运算类型极其丰富,表达
式类型多样化。灵活使用各种运算符可以实现在其它高级语言中难以实现的运
算。
3、数据类型丰富
C 语言的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、
共用体类型等。能用来实现各种复杂的数据结构的运算。并引入了指针概念,
使程序效率更高。
4、表达方式灵活实用
C 语言提供多种运算符和表达式值的方法,对问题的表达可通过多种途径获得,
其程序设计更主动、灵活。它语法限制不太严格,程序设计自由度大,如对整
型量与字符型数据及逻辑型数据可以通用等 。
5、允许直接访问物理地址,对硬件进行操作
由于 C 语言允许直接访问物理地址,可以直接对硬件进行操作,因此它既具有
高级语言的功能,又具有低级语言的许多功能,能够像汇编语言一样对位(bit)、
字节。和地址进行操作,而这三者是计算机最基本的工作单元,可用来写系统
软件。
6、生成目标代码质量高,程序执行效率高
C 语言描述问题比汇编语言迅速,工作量小、可读性好,易于调试、修改和移植,
而代码质量与汇编语言相当。C 语言一般只比汇编程序生成的目标代码效率低
10%~20%。[14]
7、可移植性好
C 语言在不同机器上的 C 编译程序,86%的代码是公共的,所以 C 语言的编译程
序便于移植。在一个环境上用 C 语言编写的程序,不改动或稍加改动,就可移
植到另一个完全不同的环境中运行。[14]
8、表达力强
C 语言有丰富的数据结构和运算符。包含了各种数据结构,如整型、数组类型、
指针类型和联合类型等,用来实现各种数据结构的运算。C 语言的运算符有 34
种,范围很宽,灵活使用各种运算符可以实现难度极大的运算。
C 语言能直接访问硬件的物理地址,能进行位(bit)操作。兼有高级语言和低级
语言的许多优点。
它既可用来编写系统软件,又可用来开发应用软件,已成为一种通用程序设计
语言。
另外 C 语言具有强大的图形功能,支持多种显示器和驱动器。且计算功能、逻
辑判断功能强大。[14]
缺点
1、 C 语言的缺点主要表现在数据的封装性上,这一点使得 C 在数据的安全性上
有很大缺陷,这也是 C 和 C++的一大区别。
2、 C 语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,
对数组下标越界不作检查等。从应用的角度,C 语言比其他高级语言较难掌握。
也就是说,对用 C 语言的人,要求对程序设计更熟练一些。[15]
C11 新特性
1 、 对 齐 处 理 (Alignment ) 的 标 准 化 ( 包 括 _Alignas 标 志 符 , alignof 运 算
符,aligned_alloc 函数以及头文件)。
2、_Noreturn 函数标记,类似于 gcc 的 __attribute__(noreturn)。
3、_Generic 关键字。
4、多线程(Multithreading)支持,包括:_Thread_local 存储类型标识符,;
头文件,里面包含了线程的创建和管理函数。
5、增强的 Unicode 的支持,基于 C Unicode 技术报告 ISO/IEC TR 19769:2004,增
强了对 Unicode 的支持。包括为 UTF-16/UTF-32 编码增加了 char16_t 和 char32_t
数据类型,提供了包含 unicode 字符串转换函数的头文件.
6、删除了 gets() 函数,使用一个新的更安全的函数 gets_s()替代。
7、增加了边界检查函数接口,定义了新的安全的函数,例如 fopen_s(),strcat_s
()等等。
8、增加了更多浮点处理宏。
9、匿名结构体/联合体支持,这个在 gcc 早已存在,C11 将其引入标准。
10、静态断言(Static assertions),_Static_assert(),在解释 #if 和 #error 之
后被处理。
11、新的 fopen()模式,(“…x”),类似 POSIX 中的 O_CREAT|O_EXCL,在文
件锁中比较常用。
12、新增 quick_exit()函数作为第三种终止程序的方式。当 exit()失败时可
以做最少的清理工作。
13、_Atomic 类型修饰符和头文件。
1.2 C compiler
1.2.1 GCC 简介
GCC(GNU Compiler Collection,GNU 编译器套件),是由 GNU 开发的编程
语言编译器。它是以 GPL 许可证所发行的自由软件,也是 GNU 计划的关键部分。
GCC 原本作为 GNU 操作系统的官方编译器,现已被大多数类 Unix 操作系统(如
Linux、BSD、Mac OS X 等)采纳为标准的编译器,GCC 同样适用于微软的 Windows。
GCC 是自由软件过程发展中的著名例子,由自由软件基金会以 GPL 协议发布。
GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C
语言。GCC 很快地扩展,变得可处理 C++。后来又扩展能够支持更多编程语言,
如 Fortran、Pascal、Objective-C、Java、Ada、Go 以及各类处理器架构上的汇编
语言等,所以改名 GNU 编译器套件(GNU Compiler Collection)。
1.2.2 GCC 基本用法
在使用 GCC 编译器的时候,我们必须给出一系列必要的调用参数和文件名称。
GCC 编译器的调用参数大约有 100 多个,这里只介绍其中最基本、最常用的参数。
具体可参考 GCC Manual。
GCC 最基本的用法是∶gcc [options] [filenames]
其中 options 就是编译器所需要的参数,filenames 给出相关的文件名称。
-c,只编译,不链接成为可执行文件,编译器只是由输入的.c 等源代码文件
生成.o 为后缀的目标文件,通常用于编译不包含主程序的子程序文件。
-o output_filename,确定输出文件的名称为 output_filename,同时这个名
称不能和源文件同名。如果不给出这个选项,gcc 就给出预设的可执行文件 a.out。
-g,产生符号调试工具(GNU 的 gdb)所必要的符号资讯,要想对源代码进行
调试,我们就必须加入这个选项。
-O,对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、链
接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,
编译、链接的速度就相应地要慢一些。
-O2,比-O 更好的优化编译、链接,当然整个编译、链接过程会更慢。
-Idirname,将 dirname 所指出的目录加入到程序头文件目录列表中,是在预
编译过程中使用的参数。C 程序中的头文件包含两种情况∶
A)#include
B)#include “myinc.h”
其中,A 类使用尖括号(< >),B 类使用双引号(“ ”)。对于 A 类,预处理程
序 cpp 在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,而 B 类,预
处理程序在目标文件的文件夹内搜索相应文件。
-v gcc 执行时执行的详细过程,gcc 及其相关程序的版本号
1.3 source
2、Methods
2.1 Headfile
2.1.1 头文件的作用
一般在一个应用开发体系中,功能的真正逻辑实现是以硬件层为基础,在驱动程序、功
能层程序以及用户的应用程序中完成的。头文件的主要作用在于多个代码文件全局变量(函
数)的重用、防止定义的冲突,对各个被调用函数给出一个描述,其本身不需要包含程序的
逻辑实现代码,它只起描述性作用,用户程序只需要按照头文件中的接口声明来调用相关函
数或变量,链接器会从库中寻找相应的实际定义代码。(eg.C++编译模式)从以上结构图来
看,头文件是用户应用程序和函数库之间的桥梁和纽带。在整个软件中,头文件不是最重要
的部分,但它是 C 语言家族中不可缺少的组成部分。编译时,编译器通过头文件找到对应的
函数库,进而把已引用函数的实际内容导出来代替原有函数。进而在硬件层面实现功能。
2.1.2 unistd.h 分析
unistd.h 是 C 和 C++ 程序设计语言中提供对 POSIX 操作系统 API 的访问功能的头文件
的名称。该头文件由 POSIX.1 标准(单一 UNIX 规范的基础)提出,故所有遵循该标准的操
作系统和编译器均应提供该头文件(如 Unix 的所有官方版本,包括 Mac OS X、Linux 等)。
对于类 Unix 系统,unistd.h 中所定义的接口通常都是大量针对系统调用的封装(英语:
wrapper functions),如 fork、pipe 以及各种 I/O 原语(read、write、close 等等)。
2.1.3 stdio.h 分析
stdio 就是指 “standard input & output"(标准输入输出)
所以,源代码中如用到标准输入输出函数时,就要包含这个头文件!
例如 c 语言中的 printf("%d",i); scanf("%d",&i);等函数。
2.1.4 dirent.h 分析
LINUX 系统下的一个头文件,在这个目录下/usr/include
为了获取某文件夹目录内容,所使用的结构体。
引用头文件#include
结构体说明
struct dirent
{
long d_ino; /* inode number 索引节点号 */
off_t d_off; /* offset to this dirent 在目录文件中的偏移 */
unsigned short d_reclen; /* length of this d_name 文件名长 */
unsigned char d_type; /* the type of d_name 文件类型 */
char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长 255
字符 */
}
相关函数
opendir(),readdir(),closedir();
2.1.5 string.h 分析
C 语言里面关于字符数组的函数定义的头文件,常用函数有 strlen、strcmp、strcpy 等等,更
详细的可以到 include 文件夹里面查看该文件。
2.1.6 sys/stat.h 分析
是 unix/linux 系统定义文件状态所在的伪标准头文件。 含有类型与函数:
dev_t
st_dev Device ID of device containing file.
ino_t
st_ino
File serial nu
mber.
mode_t
inks to the file.
dev_t
st_mode Mode of file (see below).
st_uid User ID of file.
uid_t
nlink_t st_nlink Number of hard l
gid_t
st_gid Group ID of file.
st_rdev Device ID (if file is character or block special).
off_t
st_size F
or regular files, the file size in bytes.
For symbolic links, the length in bytes of the
pathname co
ntained in the symbolic link.
For a shared memory object, the length in bytes.
For a typed memory object, the length in bytes.
For other file types, the use of this field is
time_t
st_atime Time of last access.
time_t
status change.
st_mtime Time of last data modification.
chmod(const char *, mode_t);
int
int
_t);
fstat(int, struct stat *);
int
lstat(const char *restrict, struct stat *restrict);
int mkfifo(const char *, mode_t);
int mknod(const char *, mode_t, dev_t);
int
stat(const char *restrict, struct stat *restrict);
time_t
int
fchmod(int, mode_t);
unspecified.
st_ctime Time of last
int mkdir(const char *, mode
mode_t umask(mode_t);
使用 stat 函数最多的可能是 ls-l 命令,用其可以获得有关一个文件的所有信息。
一般头文件在/usr/include 下面,这里是标准 C 程序头文件,如果你的头文件前加了 ,