简介
这次博文是我阅读 Understanding Unix/Linux Programming 这本书的第一章做的相关笔记,第一章主要是介绍了操作系统概念和一个极不完善的more
命令,这篇文章主要关注more
命令的编写,当然,这次主要是书上源码和项目组织的一点感悟,下次会是完整的编写一个more
命令。
初版
标准版源码more01.c,虽然这个版本既不支持管道连接,普通的状态下也有more?
字幕上滚的问题,但总算是有一点样子了。
心得
more
的模式
1 | /* |
先看这一段代码,一开始的时候写炸了,后来才明白,对于more
这种程序,明显是不断读入,直到完结,中间段特判并操作的模式,就应该使用
1 | while (readin) { |
这种模式,之前写的时候居然在大循环里还有读入语句,一团乱麻,bug不断。
Makefile
自动检测源文件与编译
两个程序,一个标程,一个自己的程序,有任何删改都要手动键入gcc
和一大堆编译选项多烦啊,于是写了一个Makefile
1 | SRC=$(shell find . -name "*.c") |
第一行用shell
命令找到当前目录下的所有.c
源文件,由于目前的都是单文件程序,所以第二行将目标二进制文件变成了和每个.c
文件对应的.out
文件(文本替换命令),并且用all
假目标来使得make
生效编译。
中间的两行表明对所有的.out
目标都需要一个对应的.c
文件依赖,$<
指代第一个依赖即.c
源文件,$@
指代目标即.out
文件。
这样的一个文件就完成了自动寻找所有.c
文件并编译出对应.out
文件的工作。
源文件与二进制文件分属不同文件夹
一个文件夹里,又有源文件,又有可执行文件,多乱啊,改进一下Makefile和文件组织结构
1 | .--+-src---*.c |
1 | SRC_DIR=./src |
这也很简单
- 多了两个变量
BIN_DIR
和SRC_DIR
- 对于
BIN
的文本替换模式也做了一点调整 - 加入为了避免没有文件夹而出现的
mkdir
语句 - 通过
.DEFAULT_GOAL
设置默认目标
节约内存空间
这是在文件夹Chapter01
下的结构,那岂不是每个Chapter
都要写一个一样的Makefile,再改变一下文件组织结构吧
1 | .----+--Makefile.single |
看起来还是每个文件夹一个Makefile啊,但是我把上一步的Makefile内容放置到最上层的Makefile.single里,而其余的下层Makefile只需要
1 | include ../Makefile.single |
改进版
标准源码more02.c,这个版本主要是修复了stdin
输入时无法键盘交互的bug,解决的方法是,不再从stdin
中读入指令,只从stdin
中读入要显示的内容,而输入的指令是从文件/dev/tty
中读入,/dev/tty
是一个特殊的文件,其指代了当前进程的控制终端(如果存在的话)。
但这个版本仍然有许多问题:
- 输入字符后需要回车才能读入
- 输入回车后
more?
提示符上滚 - 文件无法显示当前百分比
- 多文件显示问题很大
这个会在下一次博文中进行解释和解决,当然,完整的源码就在Github上,已经可以阅读(找bug)啦!