简单系统架构

简单系统架构:

快速了解 GNU Makefile 笔记

1. Make 程序会把第一条规则之后的多有以[Tab]字符开始的行都作为命令行来处理
2. 通过.PHONY特殊目标将clean目标声明为伪目标,防止在磁盘上存在一个clean文件名的时候,clean目标的规则无法执行
3. – 的意思是忽略命令的执行错误,比如:-rm edot $(objects)、 sinclude= -include
4. 一个完整的Makefile中,包含5个东西:显示规则,隐含规则,变量的定义,指示符和注释。
5. 默认查找Makefile文件名顺序:GNUmakefile、makefile、Makefile 推荐使用Makefile
6. Include 指示符告诉make暂停读取当前的Makefile,转去读取include指定的文件,完成后再继续当前Makefile的读取
7. MAKEFILE_LIST 变量make读取的文件名会被自动的追加到变量的定义域中
8. Makefile规则中,如果使用一个没有依赖只有命令行的双冒号规则去更新一个文件,那么每次执行make时,此规则的目标文件将会无条件的更新。
9. “所有匹配规则“
%:force
@$(MAKE) –f MAKEFILE $@
Force:;
10. 它的依赖是“force”,保证了即使目标文件已经存在也会执行这个规则
强制目标:没有命令或依赖的规则,如果一个规则没有命令或依赖,而且它的目标不是一个存在的文件名,在执行此规则时,目标总会被认为是最新的。
11.make的执行过程如下:

1. 依次读取变量“MAKEFILES”定义的makefile文件列表

2. 读取工作目录下的makefile文件(根据命名的查找顺序“GNUmakefile”,“makefile”,“Makefile”,首先找到那个就读取那个)

3. 依次读取工作目录makefile文件中使用指示符“include”包含的文件

4. 查找重建所有已读取的makefile文件的规则(如果存在一个目标是当前读取的某一个makefile文件,则执行此规则重建此makefile文件,完成以后从第一步开始重新执行)

5. 初始化变量值并展开那些需要立即展开的变量和函数并根据预设条件确定执行分支

6. 根据“终极目标”以及其他目标的依赖关系建立依赖关系链表

7. 执行除“终极目标”以外的所有的目标的规则(规则中如果依赖文件中任一个文件的时间戳比目标文件新,则使用规则所定义的命令重建目标文件)

8. 执行“终极目标”所在的规则

12.make 参数选项:
-f 指定make读取的Makefile文件 –f NAME 、–file=NAME
-n 那么make执行时只显示所要执行的命令,但不会真正的去执行这些命令 –just-print
-s 则是禁止所有执行命令的显示,就好像所有的命令均使用@开始一样 –slient
-j 可以告诉make在同一时刻可以允许多条命令同时被执行。–job
-k 当由于某种原因被终止时,会等待其它的子进程完成后才退出。
-l 告诉make限制当前运行的任务的数量—max-load 一般跟一个浮点数 -l 2.5
-I make将会忽略所有规则中命令执行错误 –ignore-errors
-w 可以让make在开始编译一个目录之前和完成此目录的编译之后给出相应的提示信息—print-directory

13.文件通配符:*、?、 [ ]
可以用在规则的目标,依赖,此时make会自动将其展开
可出现在规则的命令中,其展开是在shell执行此命令时完成
二是需要通过函数wildcard来实现

14.自动环变量
$? 表示依赖文件列表中被改变过的所有文件
$^ 表示所有的是通过目录搜索得到的依赖文件的完整路径名
$@ 表示规则的目标
$< 表示规则中通过目录搜索得到的依赖文件列表的第一个依赖文件 15.变量定义中使用的通配符不会被展开objects=”*.o” 则变量objects的值就是*.o 如果需要变量的值代表所有的.o文件需要使用函数wildcard实现(objects=$(wildcard *.o)) 16.vpath 指定搜索路径 vpath %.h ../headers如果不能再当前目录下找到,则到目录../headers下寻找。 要注意vpath 和VPATH 以及GPATH变量定义搜索路径时,生成目标文件的路径问题。 17. SUBDIRS = foo bar baz .PHONY: subdirs $(SUBDIRS) subdirs: $(SUBDIRS) $(SUBDIRS): $(MAKE) -C $@ foo: baz 上边的实现中使用了一个没有命令行的规则“foo: baz”,用来限制子目录的make顺序。此规则的含义时在处理“foo”目录之前,需要等待“baz”目录处理完成。 18.Makefile的特殊目标 .PHONY:所有的依赖被作为伪目标,当用make 命令行指定此目标时,目标所在的规则定义的命令都会被无条件的执行。 .SUFFIXES : 所有依赖指出了一系列在后缀规则中需要检查的后缀名 .DEFAULT:被用在重建那些没有具体规则的目标 .PRECIOUS:当命令在执行过程中被中断时,make不会删除它们 .INTERMEDIATE:的依赖文件在make时被作为中间过程文件对待。没有任何依赖文件的目标“.INTERMEDIATE”没有意义。 .SECONDARY:的依赖文件被作为中间过程文件对待。但这些文件不会被自动删除 .DELETE_ON>ERROR:如果规则的命令执行错误,将删除已经被修改的目标文件
.IGNORE:指定依赖文件,则忽略创建这个文件所执行命令的错误。给此目标指定命令是没有意义的。当此目标没有依赖文件时,将忽略所有命令执行的错误
.SILENT:的依赖列表中的文件,make在创建这些文件时,不打印出重建此文件所执行的命令。同样,给目标“.SILENT”指定命令行是没有意义的。没有任何依赖文件的目标“.SILENT”告诉make在执行过程中不打印任何执行的命令。
.EXPORT_ALL_VARIABLES:它的功能含义是将之后所有的变量传递给子make进程
.NOTPARALLEL:则所有命令按照串行方式执行
19. 某些情况下,需要对相同的目标使用不同的规则中所定义的命令,这种情况我们可使用另外一种方式“双冒号”规则来实现。
20.:: 对于一个没有依赖而只有命令行的双冒号规则,当引用此目标时,规则的命令将会被无条件执行。当同一个文件作为多个双冒号规则的目标时。这些不同的规则会被独立的处理,而不是像普通规则那样合并所有的依赖到一个目标文件。
21.gcc 支持一个-M的选项来实现自动找寻源文件中包含的头文件,并生成一个依赖关系。
当我们不需要标准库的依赖规则描述时,应该使用-MM则输出的便是我们自己写的.h的头文件
22.$$$$ 表示当前的进程号
23. 在一个规则的命令中,命令行“cd”改变目录不会对其后的命令的执行产生影响。就是说其后的命令执行的工作目录不会是之前使用“cd”进入的那个目录。如果要实现这个目的,就不能把“cd”和其后的命令放在两行来书写。而应该把这两条命令写在一行上,用分号分隔
foo : bar/lose
cd bar; gobble lose > ../foo
25.Make命令运行结束后返回0为正确的执行。返回非0为出错
26.mkdir -p 命令的使用,一次性创建多层次的目录
27.Make的递归调用 $(MAKE) –C subdir
28.CURDIR此变量代表了make当前的工作路径,使用-C选项进入目录后,此变量会被从新赋值
29.上层Makefile中定义的某一个变量需要传递给子make时,应该在上层Makefile中使用指示符“export”对此变量进行声明。
30.在多级递归调用的make执行过程中。变量“MAKELEVEL”代表了调用的深度。
31. 采用define endef 定义命令包。
32.变量定义
= 风格的变量时递归方式扩展的变量。
:= 直接展开式变量
?= 条件赋值操作符,只有变量之前没有赋值的情况下才会对这个变量进行赋值。
$(foo:.o=.c) 变量的替换引用,替换foo变量中所有以.c结尾的文件为.o结尾
+= 追加变量
Override 变量在定义时使用了“override”,则后续对它值进行追加时,也需要使用带有“override”指示符的追加方式。否则对此变量值的追加不会生效。
% 模式变量,单独使用“%”作为目标时,指定的变量会对任何类型的目标文件都有效
33.+之后的命令都需要执行。

GNU MAKE内嵌函数

$(subst FROM,TO,TEXT) 把字串TEXT中的FROM替换为TO,返回替换后的新字串

$(patsubst PATTERN,REPLACEMENT,TEXT) 搜索TEXT中以空格分开的单词,将符合模式TATTERN的替换为REPLACEMENT,返回替换后的新字串
eg:$(patsubst %.c,%.o,x.c c.c bar.c) 把字串x.c c.c bar.c中以.c结尾的单词替换成以.o结尾的字符,返回的结果是:x.o o.o bar.o

$(strip STRINT) 去掉字串STRING开头和结尾的空字符,返回无前导和结尾空字符,使用单一空格分割的多个单词字符串

$(findstring FIND,IN) 搜索字串IN,查找FIND字串,如果在IN中存在FIND则返回FIND,否则返回空。搜索需要时严格的文本匹配

$(filter PATTERN…,TEXT) 过滤掉字串TEXT中所有不符合模式PATTERN的单词,保留所有符合此模式的单词,可以使用多个模式,模式中一般需要包含模式字符%,存在多个模式时,模式表达式之间使用空格分割。返回所有符合模式的字串。

$(filter-out PATTERN…,TEXT) 过滤掉字串TEXT中所有符合模式PATTERN的单词,保留所有不符合此模式的单词,和filter函数相反。返回所有不符合模式的字串。

$(sort LIST) 给字串LIST的单词以首字母为准进行排序(升序),并去掉重复的单词,返回空格分割没有重复的单词。

$(word N,TEXT) 取字串TEXT中第N个单词(N从1开始),返回字串TEXT中第N个单词

$(wordlist S,E,TEXT) 从字串TEXT中取出从S开始到E的单词(S,E表示单词在字串中位置的数字),返回字串TEXT中从第S到E的单词串。(S和E都从1开始,当S比TEXT中的数字大时,返回空。如果E大于TEXT字数,返回从S开始到结尾的单词串,如果S大于E也是返回空)

$(words TEXT) 统计字串TEXT中单词的数目,返回TEXT字串中的单词数。

$(firstword NAMES…) 取字串NAMES…中的第一个单词,返回NAMES…的第一个单词,以空格分割序列

$(dir NAMES) 从文件名序列NAMES中取出各个文件名目录部分,返回空格分割的文件名序列NAMES…中每一个文件的目录部分。

$(notdir NAMES…) 从文件名序列NAMES…中取出非目录部分,返回空格分割的文件名序列NAMES…中每一个文件的非目录部分。

$(suffix NAMES…) 从文件名序列NAMES…中取出各个文件名的后缀,返回以空格分割的文件名序列NAMES…中每一个文件的后缀序列。

$(basename NAMES…) 从文件名序列NAMES…中取出文件名的前缀部分,返回前缀序列,没有前缀则返回空字串

$(addsuffix SUFFIX,NAMES…) 为NAMES中的每一个文件名添加后缀SUFFIX,将SUFFIX加到每一个文件的后面,返回以空格分割的添加了后缀SUFFIX的文件序列

$(addprefix PREFIX,NAMES…) 为NAMES中的每一耳光文件添加前缀PREFIX,返回以空格分割的添加了前缀PREFIX的文件序列。

$(join LIST1,LIST2) 将字串LIST1和字串LIST2各个单词进行对应连接,就是将LIST2中的第一个单词追加到LIST1第一个单词字后合并为一个单词,将LIST2中第二个单词追加到LIST1的第二个单词之后合并为第一个单词,返回单空格分割的合并后的字串序列。

$(wildcard PATTERN) 列出当前目录下所有符合模式PATTERN格式的文件名,返回空格分割的存在当前目录下的所有符合模式PATTERN的文件名

$(foreach VAR,LIST,TEXT) 类似foreach(VAR,LIST){ TEXT }

$(if CONDITION,THEN,ELSE) 第一个参数CONDITTION的展开结果非空,则条件为真,将第二个参数的THEN作为函数的返回值,CONDITION的结果为空,返回ELSE的结果,当不存在第三个参数,且CONDITION为空时,返回空。

$(call VARIABLE,PARAM,PARAM…) call函数是唯一一个可以创建指定参数化的函数引用的函数,在执行时,将它的参数“PARAM”依次赋值给临时变量“$(1)”、“$(2)”(这些临时变量定义在“VARIABLE”的值中,参考下边的例子)…… call函数对参数的数目没有限制,也可以没有参数值,没有参数值的“call”没有任何实际存在的意义。执行时变量“VARIABLE”被展开为在函数上下文有效的临时变量,变量定义中的“$(1)”作为第一个参数,并将函数参数值中的第一个参数赋值给它;变量中的“$(2)”一样被赋值为函数的第二个参数值;依此类推(变量$(0)代表变量“VARIABLE”本身)。之后对变量“VARIABLE” 表达式的计算值。
Ø 返回值:参数值“PARAM”依次替换“$(1)”、“$(2)”…… 之后变量“VARIABLE”定义的表达式的计算值。
示例:
reverse = $(2) $(1)
foo = $(call reverse,a,b)
变量“foo”的值为“ba”。这里变量“reverse”中的参数定义顺序可以根据需要来调整

$(value VARIABLE) 不对变量VARIBLE进行任何展开操作,直接返回变量VARIBALE代表的值。

eval函数
函数功能:函数“eval”是一个比较特殊的函数。使用它我们可以在我们的Makefile中构造一个可变的规则结构关系(依赖关系链),其中可以使用其它变量和函数。函数“eval”对它的参数进行展开,展开的结果作为Makefile的一部分,make可以对展开内容进行语法解析。展开的结果可以包含一个新变量、目标、隐含规则或者是明确规则等。也就是说此函数的功能主要是:根据其参数的关系、结构,对它们进行替换展开。
返回值:函数“eval”的返回值时空,也可以说没有返回值。
函数说明:“eval”函数执行时会对它的参数进行两次展开。第一次展开过程发是由函数本身完成的,第二次是函数展开后的结果被作为Makefile内容时由make解析时展开的。明确这一点对于使用“eval”函数非常重要。在理解了函数“eval”二次展开的过程后。实际使用时,当函数的展开结果中存在引用(格式为:$(x))时,那么在函数的参数中应该使用“$$”来代替“$”。因为这一点,所以通常它的参数中会使用函数“value”来取一个变量的文本值。
我们看一个例子。例子看起来似乎非常复杂,因为它综合了其它的一些概念和函数。不过我们可以考虑两点:其一,通常实际一个模板的定义可能比例子中的更为复杂;其二,我们可以实现一个复杂通用的模板,在我们的所有Makefile中包含它,以可作到一劳永逸。相信这一点可能是大多数程序员所推崇的。
示例:
# sample Makefile
PROGRAMS = server client
server_OBJS = server.o server_priv.o server_access.o
server_LIBS = priv protocol
client_OBJS = client.o client_api.o client_mem.o
client_LIBS = protocol
# Everything after this is generic
.PHONY: all
all: $(PROGRAMS)
define PROGRAM_template
$(1): $$($(1)_OBJ) $$($(1)_LIBS:%=-l%)
ALL_OBJS += $$($(1)_OBJS)
endef
$(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog))))
$(PROGRAMS):
$(LINK.o) $^ $(LDLIBS) -o $@
clean:
rm -f $(ALL_OBJS) $(PROGRAMS)
我们来看一下这个例子:它实现的功能是完成“PROGRAMS”的编译链接。例子中“$(LINK.o)”为“$(CC) $(LDFLAGS)”,意思是对所有的.o文件和指定的库文件进行链接。
“$(foreach prog,$(PROGRAM),$(eval $(call PROGRAM_template,$(prog))))”展开为:
server : $(server_OBJS) –l$(server_LIBS)
client : $(client_OBJS) –l$(client_LIBS)

$(origin VARIABLE) 查询参数VARIABLE的出处,返回VARIABLE的定义方式。
函数的返回情况有以下几种:
1. undefined
变量“VARIABLE”没有被定义。
2. default
变量“VARIABLE”是一个默认定义(内嵌变量)。如“CC”、“MAKE”、“RM”等变量(参考 10.3 隐含变量 一节)。如果在Makefile中重新定义这些变量,函数返回值将相应发生变化。
3. environment
变量“VARIABLE”是一个系统环境变量,并且make没有使用命令行选项“-e”(Makefile中不存在同名的变量定义,此变量没有被替代)。
4. environment override
变量“VARIABLE”是一个系统环境变量,并且make使用了命令行选项“-e”。Makefile中存在一个同名的变量定义,使用“make -e”时环境变量值替代了文件中的变量定义。
5. file
变量“VARIABLE”在某一个makefile文件中定义。
6. command line
变量“VARIABLE”在命令行中定义。
7. override
变量“VARIABLE”在makefile文件中定义并使用“override”指示符声明。
8. automatic
变量“VARIABLE”是自动化变量。

$(shell cat foo) 函数shell实现的功能和shell中用()相同,实现的是命令的扩展,意味着需要一个shell命令作为它的参数,返回的结果是此命令在shell中的执行结果。返回空字符、。

$(error TEXT…) 产生致命错误,并提示TEXT…信息给用户,之后退出make的执行。

$(warning TEXT…) 提示TEXT信息,make的执行过程继续,返回空字符

vim 编辑器简单配置

let g:winManagerWindowLayout=’FileExplorer|TagList’
nmap wm :WMToggle
filetype plugin indent on
set completeopt=longest,menu

colorscheme desert
set nu
set autochdir
” 开启语法高亮
syntax on
” 设置文字编码自动识别
set fencs=utf-8,cp936,gb2312
” 使用鼠标
set mouse=a
” 设置高亮搜索
set hlsearch
” 输入字符串就显示匹配点
set incsearch
” 输入的命令显示出来,看的清楚些。
set showcmd
” Tlist的内部变量。函数列表。
” 窗口在右边显示
” let Tlist_Use_Right_Window=1
let Tlist_File_Fold_Auto_Close=1
” 打开当前目录文件列表
map :Explore
” 函数和变量列表
” map :TlistToggle
” 搜索当前词,并打开quickfix窗口
map :call Search_Word()
” 全能补全
” inoremap
” 没事,鼠标画线玩的。
” noremap :call ToggleSketch()
” 启动函数变量快速浏览的时间设置
set updatetime=100
if has(“cscope”)
set csprg=/usr/bin/cscope
set csto=0
set cst
set nocsverb
” add any database in current directory
if filereadable(“cscope.out”)
cs add cscope.out
” else add database pointed to by environment
elseif $CSCOPE_DB != “”
cs add $CSCOPE_DB
endif
set csverb
set cscopetag
set cscopequickfix=s-,g-,c-,d-,t-,e-,f-,i-
endif
nnoremap :TlistToggle
set autoindent “自动缩进
set smartindent “智能缩进
set cindent “C缩进
set tabstop=4
set softtabstop=4
set shiftwidth=4
set showmatch
set tags=tags;
set autochdir

TCP/IP协议专业名词

TCP/IP 传输控制协议/网际协议, Transmission Control Protocol/Internet Protocol
INDC Internet 网络操作中心, Network operations Center
GGP 网关-网关协议, Gateway-to-Gateway Protocol
IPP 互联网打印协议, Internet Printing Protocol
LDPA 轻型文档打印应用, Lightweight Document Printing Application
HTPP 超文本打印协议, H y p e r Text Printing Protocol
PWG 打印工作组, Printer Working Group
MIME 多目的I n t e r n e t邮件扩展, Multipurpose Internet Mail Extension
N I S 网络信息服务, Network Information Service
A C S E 相关控制服务元, Association Control Service Element
R O S E 远程操作服务元, R e m o t e Operation Service Element
N AT 过网络地址转换, Network Address Tr a n s l a t i o n
D S L 数字用户环, Digital Subscriber Loop
PA P 口令认证协议, Password Authentication Protocol
C H A P 挑战握手认证协议, C h a l l e n g e Handshake Authentication Protocol
I n t e r N I C 互联网络信息中心, Internet Network Information C e n t r e)
IANA I n t e r n e t号分配机构, Internet Assigned Numbers Authority
I S O C Internet协会, Internet Society
I A B Internet体系结构委员会, Internet Architecture Board
I E T F Internet工程专门小组, Internet Engineering Task Force
IESG Internet工程指导小组, Internet Engineering Steering Group
IR I F Internet研究专门小组, Internet Research Task Force

获取R F C的方法清单:
To: rfc-info@ISI.EDU
Subject: getting rfcs
help: ways_to_get_rfcs
BSD BSD系统Berkeley Software D i s t r i b u t i o n
TLI 运输层接口, Transport Layer Interface / XTI X/ Open运输层接口
S N A P 子网接入协议, Sub-network Access P r o t o c o l
D S A P 目的服务访问点, Destination Service Access Point,
SSAP 源服务访问点, Source Service Access Point,
S L I P 串行线路IP, Serial Line IP
L C P 链路控制协议, Link Control Protocol
N C P 的网络控制协议, Network Control Protocol

TCP/IP协议 之DHCP服务

TCP/IP协议

对于DHCP中客户机时如何取得一个地址的呢?
以下各步说明了一台客户机获得地址的基本方法:
1) 客户机通过D h c p D i s c o v e r广播提出请求。如果客户机有一个永久性的租用地址,它可
以直接请求那个地址。
2) 服务器一旦收到I P请求,会从地址池中取出一个地址并返回一个附有可用I P地址的
D h c p O ff e r报文。
3) 如果客户机收到多个I P,它会选择第一个或其所请求的那一个。
4) 客户机广播标识服务器的D h c p R e q u e s t报文并等待。
5) 每一个服务器检查报文,若发现不是它的标识,它会丢弃报文。当被标识的服务器接
72使用第二部分命名和寻址
下载
收了报文后,它会发回一个D h c p A c k报文,如果所请求的I P被分配也就是说租用已中止,会
发回D h c p N a k报文。
6) 如果客户机收到D h c p A c k报文,它可以开始使用I P地址。如果它收到D h c p N a k,它会重
新开始整个过程。假如I P有问题,客户机会发送一个D h c p D e c l i n e报文给服务器并重新开始。
注意一个永久性地址和一台机器永久地结合在一起。实际上,没有这样的永久性地址,
因为一段时间之后所有的租用必须中止。但是一个永久性的租用可以在一段时间内连
续使用几个月,每当机器和网络相连接请求IP地址时要重置时钟。
虽然看起来无需重复,但在这些步骤在D H C P环境是下是正确操作所必须的。这些功能也
是D H C P区别于B O O T P的地方。

1 2