深入浅出Flashcache(三)

前文简单介绍了block devicedevice mapper。有了这两个基础,再来看flashcache的代码,就容易理解多了。Flashcache是一个内核模块,要更清晰的理解代码,还需要了解一下内核模块编写的一些基础知识。好吧,虽然对于内核编程我完全是个门外汉,这里还是需要现学现卖下。所以这一篇还是不会切入正题,已经熟悉Linux内核模块的同学请忽略并耐心等待。

Linux内核支持动态的加载模块(Loadable Kernel Module,LKM)以完成某些特定的功能,模块编程需要按照一定的格式以便可以和内核交互。

5. 内核符号表

内核模块之间的交互需要通过特定的共享变量和函数,这些都需要输出到内核符号表。在模块编程中使用EXPORT_SYMBOL来进行定义。在内核中则使用了kernel_symbol结构来保存符号表信息。

Read more of this post

Perl的English模块

Perl中有很多以$开头的特殊变量,如果使用得当,可以写出简洁高效的代码,但对于阅读代码来说就带来了一些困扰。因此Perl内置了名为English的模块,对这些特殊变量定义了英文别名,记录于此备查。


special variable
alias
miscellaneous  
$_ $ARG
@_ @ARG
$" $LIST_SEPARATOR
$;
$SUBSCRIPT_SEPARATOR
or $SUBSEP
regular expression or matching  
$& $MATCH
$` $PREMATCH
$' $POSTMATCH
$+ $LAST_PAREN_MATCH
input  
$. $INPUT_LINE_NUMBER or $NR
$/ $INPUT_RECORD_SEPARATOR or $RS

output
 
$| $OUTPUT_AUTOFLUSH
$, $OUTPUT_FIELD_SEPARATOR or $OFS
$\ $OUTPUT_RECORD_SEPARATOR or $ORS
formats  
$% $FORMAT_PAGE_NUMBER
$= $FORMAT_LINES_PER_PAGE
$_ $FORMAT_LINES_LEFT
$~ $FORMAT_NAME
$^ $FORMAT_TOP_NAME
$: $FORMAT_LINE_BREAK_CHARACTERS
$^L $FORMAT_FORMFEED
error status  
$? $CHILD_ERROR
$! $OS_ERROR or $ERRNO
$@ $EVAL_ERROR
process information  
$$ $PROCESS_ID or $PID
$< $real_user_id or $UID
$> $EFFECTIVE_USER_ID or $EUID
$( $REAL_GROUP_ID or $GID
$) $EFFECTIVE_GROUP_ID or $EGID
$0 $PROGRAM_NAME
internal variables  
$] or $^V $PERL_VERSION
$^A $ACCUMULATOR
$^D $DEBUGGING
$^F $SYSTEM_FD_MAX
$^I $INPLACE_EDIT
$^O $OSNAME
$^P $PERLDB
$^T $BASETIME
$^W $WARNING
$^X $EXECUTABLE_NAME

Perl自定义模块的路径包含问题

Perl模块是重用代码的好方法,但是在调用自定义模块时的路径问题困扰了我许久。之前一直都是通过在代码中直接将自定义模块所在的绝对路径写入到@INC数组来解决的,以下示例,加入perl脚本放置在/opt/perl/bin,而自定义模块放在/opt/perl/lib目录:

BEGIN {
    push (@INC,'/opt/perl/lib');
}

或者

BEGIN {
    unshift @INC,'/opt/perl/lib';
}

或者

 use lib '/opt/perl/lib';

使用绝对路径比较麻烦,如果将程序迁移到另外的安装目录,就需要去更改所有的脚本。而直接在use lib中使用相对路径,如use lib ‘../lib';,测试发现手动执行bin目录下的perl脚本是可以的,但是放到crontab里去跑就找不到模块了。于是想先找到bin目录的路径,然后通过相对路径跳转到lib目录,在《Perl Cookbook》终于找到了我想要的,使用FindBin模块就能实现梦想了:

use FindBin qw($Bin);
use lib "$Bin/../lib";

编写Perl模块

这两天在用Perl编写一些监控脚本,其实写代码也是一件挺有意思的事情,就是挺废时间的。而且,由于语法不太熟,基本想到一个东西都要先Google一下看怎么实现。Perl的语法相对来说有点晦涩,主要是一些内置变量和函数处理得相当精巧,而过于精致的东西理解起来就有点费力。相对于Shell,Perl在很多方面更加强大高效,比如Hash(关联数组)就非常好用,如果要将不同主机发出来的告警信息发送到不同的责任人,在shell中要做非常多的if或者case判断,修改起来也非常费力,而使用关联数组,则可以轻松实现该功能,代码简洁,配置方便,一个字,爽。

Perl支持以模块对代码进行封装。著名的CPAN上就有非常多好用的Module,可以极大的减轻开发量。一个简单的模块:

package NinGoo;
require Exporter;
use strict;
use warnings;

our @ISA = qw(Exporter);
our @EXPORT = qw(func_public); #要输出给外部调用的函数或者变量,以空格分隔
our @version = 1.0;
sub func_private{
print “This is a private function”;
}

sub func_public{
print “Hello,world\n”;
func_private();
}

1;
__END__

模块的文件名一般以.pm做后缀,名字和package相同,也就是上面这个Module的名字为NinGoo.pm。然后在普通的.脚本中调用:

#!/usr/bin/perl -w
# creator: NinGoo
# function: test perl module

BEGIN {
push (@INC,’/home/module’);
}

use strict;
use NinGoo;

func_public();

O’Relly出版了一系列Perl的图书,比较著名的大骆驼《Programming Perl》在这里有一个在线中文版本的,可以看看。

无觅相关文章插件,快速提升流量