logo资料库

linux期末论文.docx

第1页 / 共16页
第2页 / 共16页
第3页 / 共16页
第4页 / 共16页
第5页 / 共16页
第6页 / 共16页
第7页 / 共16页
第8页 / 共16页
资料共16页,剩余部分请下载后查看
1、Instruction
1.1 C language
1.1.1 发展历史
1.1.2 语言标准
1.1.3 语言特点
1.1.4 C语言的优缺点
1.2 C compiler
1.2.1 GCC简介
1.2.2 GCC基本用法
1.3 source
2、Methods
2.1 Headfile
2.1.1 头文件的作用
2.1.2 unistd.h分析
2.1.3 stdio.h 分析
2.1.4 dirent.h 分析
2.1.5 string.h 分析
2.1.6 sys/stat.h 分析
2.1.7 stdlib.h 分析
2.2Structure Variable
2.2.1 DIR *dp 分析
2.2.2 struct dirent *entry 分析
2.2.3 struct stat statbuf 分析
3、Design
3.1 UML
3.2 Logic analysis
3.2.1 程序执行描述
3.2.2 逻辑分析流程图
4、Programming
4.1 Main函数
4.1.1 main函数简介
4.1.2 main函数的参数形式
4.1.3 在操作系统中的运行命令分析
4.1.4 命令行鱼main函数的参数的关系
4.2 Function函数
4.2.1 printdir函数分析
4.2.2 chdir 函数分析
4.2.3 opendir 函数分析
4.2.4 closedir 函数分析
4.2.5 readdir 函数分析
4.2.6 strcmp 函数分析
4.2.7 fprintf 函数分析
4.2.8 lstat 函数分析
5、Future work
5.1程序升级方案
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 程序头文件,如果你的头文件前加了 ,
分享到:
收藏