由浅入深经典项目10例
为了使读者能熟练地掌握Unix下C语言的编程,本处精选了10个项目,其中每个项目都包含了一类或综合了多类知识点。读者需要独立完成这些项目,这样一方面可以加深对Unix下C语言编程知识的了解,另一方面,由于这里的项目直接来源于生产实践或者本身就是生产项目,读者可以直接应用于工作中去。
C.1 文件系统管理器
本项目包括字符界面下管理文件系统的一系列功能,比如创建目录、删除目录、移动文件、删除文件、列目录、查询文件、统计目录占用空间和报告磁盘剩余空间等。本项目主要涉及了文件子系统的相关内容。
1. 创建目录程序mkdir
本程序创建指定的目录,其命令行格式为:
当指定的是不带路径时目录时,程序mkdir在当前目录下创建该目录。当指定是一个带路径的字符串时,程序mkdir将分别创建其中的每一级目录。
2. 删除目录空间rmdir
本程序删除指定的目录,其命令行格式为:
当指定的目录下没有文件时,程序rmdir直接删除之。当指定目录下还具有文件时,程序rmdir将询问操作者是否完全删除目录,等待肯定的回答后将删除指定目录及其下的所有的文件。
3. 列目录程序ls
本程序显示指定文件的属性信息或指定目录下的全部文件属性信息,其命令行格式为:
命令行参数中"文件名"指定了文件的路径或名称,本程序打印包括文件权限、链接数、用户名、群组名、长度、创建日期、创建时间和文件名称在内的文件属性信息。如果指定的文件是目录文件,则打印该目录下的全部文件信息,如果指定文件是符号链接文件,则增加打印被链接文件的路径和名称。
4. 搜索文件程序find
本程序在指定的目录下搜索符合要求的文件并打印结果,其命令行格式为:
其中查询要求可以是文件权限、链接数、用户名、群组名、长度、创建日期、创建时间或文件名称等。
5. 统计目录占用磁盘空间程序du
本程序统计指定的目录下各个文件所占用的文件空间及其总和,其命令行格式为:
程序du深度遍历指定目录下的所有目录和文件、获取每一个文件占用的磁盘块、统计每一个子目录下所有文件占用的磁盘块数量、并汇总计算出指定目录下所有文件占用的磁盘块数量大小。
6. 报告磁盘剩余空间程序df
本程序获取指定目录所在文件系统的当前可用数据块数和可用i节点块数、全部数据块总数和全部i节点块总数,并统计当前可用数据块的比率和可用i节点块的比率,其命令行格式为:
其中命令行参数指定了待统计的文件系统,如果没有指定目录,返回当前系统中所有已mount的文件系统的剩余空间情况。
C.2 文件管理器
本项目包括字符界面下管理文件的一系列功能,比如拷贝文件、删除文件、简单打印文件、交互式打印文件、16进制打印文件和字符串匹配等。本项目主要涉及了文件子系统的相关内容。
1. 拷贝文件程序cp
本程序将源文件复制到目标文件输出,它的命令行格式如下:
2. 删除文件程序rm
本程序将指定文件从磁盘中删除掉,它的命令行格式如下:
3. 打印文件cat
本程序按普通文本格式打印指定的文件的数据内容,它的命令格式如下
4. 交互式打印文件more
本程序按屏幕分页打印指定的文本文件的数据内容,用户可以交互式的输入命令打印前一页或后一页的文件内容。
5. 16进制打印文件od
本程序以十六进制的方式打印指定文件的数据内容,它的命令格式如下:
它的输出格式实例如下:
[0000000]: 7A 68 75 79 75 6E 78 69 61 6E 67 68 75 70 69 6E :zhuyunxianghupin [0000022]: 67 |
6. 字符串匹配grep
本程序在指定文件中查询并打印字符串出现的位置,它的命令格式如下:
当待指定的文件是普通文件时,程序grep只在该文件内匹配字符串。如果指定的是目录文件,程序grep将在该文件下的所有文件中匹配字符串。
C.3 进程管理器
本项目包括在字符界面下管理进程的一系列功能,比如列举系统当前运行的全部进程信息、启动进程和向进程发送信号等。本项目主要涉及了Unix下多进程和信号系统等相关内容。
1. 列举运行进程信息ps
本程序获取并打印系统当前正在运行的所有进程的属性信息,属性项包括进程标识号、父进程标识号、进程进程最近消耗的CPU资源、启动进程的时间、启动进程的终端号、进程实际占用CPU的执行时间、启动进程的名称等信息。
2. 启动进程
在一个进程中启动另一个程序,并且能够实时获取被启动进程的输出信息,以便将此信息打印到任何位置。
3. 向进程发送信号
向运行的进程发送控制信息。
C.4 模拟数据库存储项目
本项目采用文件模拟数据库的表格存储银行卡交易明细。已知某银行系统的银行卡交易流水按如下固定分隔字符串格式储存:
交易日期|银行卡号|交易时间|流水号|交易终端号|金额|手续费|......
由于种种原因,该银行的卡历史交易流水不能存储到数据库中,需要将这些交易明细转移到文件保存,但又要保持"快"的查找速度。因此我们按照以下规格设计卡交易明细文件:
1. 卡交易流水按日期分别存储,存储文件以该日期命名。实际上我们不仅可以每天生成一个文件存储当天的交易明细,甚至可以将一天的交易流水拆分成若干个文件来存储。
2. 将该文件分为3个部分,分别是信息头部分、索引部分和数据部分:
(1) 信息头部分指定了文件中最大存储明细条数的实际存储的条数。
(2) 索引部分按银行卡号从小到大的顺序存储了银行卡交易明细信息索引,其中每行字符代表了一条银行卡交易索引,采用固定分隔的字符串报文表示,其格式如下:
(3) 数据部分中的每行字符都指定了一条银行卡交易明细信息,其格式为:
交易日期|银行卡号|交易时间|流水号|交易终端号|金额|手续费|......
数据部分按照卡号从小到大的顺序存储了交易明细信息,每条交易明细对应索引部分的一条记录,每条明细在文件中的偏移量都记载在索引部分中。
本项目包括写入程序和读取程序,其中写入程序从外界(比如数据库)读入银行卡明细并转存到文件中,读取程序从文件中获取银行卡交易明细,它的对外接口如下:
select * from line where accdate = "??" and accno = "??" |
其中可以选择只显式银行卡明细中的某一、几项,参数accdate是交易日期,参数accno是交易卡号,交易日期和交易卡号是必须输入项。
本项目主要涉及了报文解析和文件子系统的相关内容。
C.5 俄罗斯方块程序设计
在Unix字符界面上实现俄罗斯方块游戏,本项目是唯一没有来源于生产的项目,它主要涉及了curses库和信号的具体内容。
C.6 IPC对象操作程序设计
本项目设计一个组合了命令ipcs和命令ipcrm功能的程序,它能够消息队列、信号量和共享内存等IPC对象进行创建、读取、写入、查询和删除等重操作。本项目主要涉及了进程间通信的具体内容。
C.7 操作终端外设项目
在生产应用中外设常常连接在终端上,而不同的外设、不同的终端具有不同的操作方法,为了方便处理,本项目将不同的终端和外设的操作函数设计成专门的动态链接库,应用程序只需把终端和外设的信息配置起来,在操作时调入相应的动态库函数执行即可。本项目主要涉及了设备文件和库函数的具体内容。
C.8 聊天项目后台
设计一个在局域网内聊天的后台服务程序,它包括用户登录、接收聊天数据、转发聊天数据和退出登录等功能,本项目主要涉及了并发套接字的具体内容。
C.9 SOCK5代理服务器项目
文档RFC1928 定了SOCK5代理的规则,本项目根据该文档设计一个支持SOCKS的代理服务器。本项目几乎涉及到了Unix下C语言编程中的全部知识。
C.10 网络游戏后台项目
设计一个网络棋牌游戏的后台服务程序,它包括用户登录、初始化棋牌、接收出牌信息和转发出牌信息等功能。本项目几乎涉及到了Unix下C语言编程中的全部知识。