多进程使用文件锁

文件锁

单进程内多线程可以通过抢占内存锁来保持互斥,在多进程中无法通过内存锁完成,其中的一个办法是可以通过文件锁实现。

大致的思路:每个进程当需要执行关键操作时需要判断是否有其他进程已经在执行,通过查看并创建本地特定文件来判断和抢占这次操作的执行权限,道理同锁机制一致。

以上思路中查看并创建需要是一个原子操作,才能保证中间不会被其他进程截胡。

例如:

1
2
3
4
5
6
7
8
#! /bin/bash
file="/tmp/proj_name"
if [ -f "$file" ]
then
touch $file
else
exit 1
fi

这种方法在检测和创建中可能被其他进程抢占,造成两个进程同时创建文件,因此不可取。

这里采用mkdir

1
2
3
4
5
#! /usr/bin/env bash
if ! mkdir /tmp/myscript.lock 2>/dev/null; then
echo "Myscript is already running." >&2
exit 1
fi

依靠mkdir的创建文件夹,如果文件夹存在则返回>0的错误可判断,执行完毕后别忘了删除文件夹,释放这个文件锁

trap

另外,还有一个命令trap,可以根据传入信号在程序退出做指定的操作,例如

1
2
3
4
5
6
7
8
trap 'echo "$$" > "/tmp/pid";exit' SIGINT
count=0
while :
do
sleep 1
count=$(expr $count + 1)
echo $count
done

程序在无限循环并每秒打印一个递增数字, 在进程收到SIGINT(ctrl + c)的中断信号后,将进程号输入到/tmp/pid文件中,trap可以完成一个进程最后的收尾工作,如清理日志和其他操作

flock

flock 分为共享锁和独享锁,共享锁之间可以同时存在,共享锁和独享锁以及独享锁之间不能够共存。

flock -x $file 获取某文件的独享锁,获取到则接着执行后面的语句,因为flock的参数是一个fd,在进程关闭后所有fd会被关闭,flock的锁也会随即消失,避免出现进程意外退出锁未释放的问题。

flock -n $fd, 设置成非阻塞模式,通过判断 $? 可以知道是否锁成功

flock机制是linux提供的现成的文件锁,比mkdir方便。

vim配置插件

pathogen

vim的插件统一由pathogen管理

1.mkdir -p ~/.vim/autoload ~/.vim/bundle 
2.curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim

之后将想要安装的插件统一放在~/.vim/bundle 下面

python-mode

支持python的编写模式

1.cd ~/.vim
2.mkdir -p bundle && cd bundle
3.git clone git://github.com/klen/python-mode.git

 NERDTree

支持侧栏显示文件系统

1.cd ~/.vim/bundle 
2.git clone https://github.com/scrooloose/nerdtree.git
3.Then reload vim, run :Helptags, and check out :help NERD_tree.txt.

taglist

支持ctag分析文件,将当前文件的宏、变量、函数列在symbol表中

因为mac中默认的/usr/bin/ctags不是exuberant ctags,所以使用时会出现问题,需要自己下载ctags编译安装到非/usr/bin 目录下
从 http://www.vim.org/scripts/script.php?script_id=273 下载最新的ctag包
tar -xvzf ctags-5.8.tar.gz
cd ctags-5.8
./configure
make && sudo make install
我们已经安装了自己的ctag,此时需要修改系统路径
which ctags  此时显示是/usr/bin/ctags
vim ~/.profile
添加 export PATH="/usr/local/bin:/usr/local/sbin:$PATH"
source ~/.profile
which ctags 此时显示是/usr/local/bin/ctags
在~/.vimrc中配置
let Tlist_Ctags_Cmd = '/usr/local/bin/ctags'
let Tlist_Show_One_File = 1 "不同时显示多个文件的tag,只显示当前文件的
let Tlist_Exit_OnlyWindow = 1 "如果taglist窗口是最后一个窗口,则退出vim
let Tlist_Use_Right_Window = 1 "在右侧窗口中显示taglist窗口

 More~

有时会用鼠标进行复制,当有行号时默认会复制到行号,如果不想复制行号,可以在~/.vimrc中设置

set mouse=a

此时鼠标可以像IDE中一样通过滚动来上下查看,并在选中时不会包括到行号。

常见加密算法

Crypto

根据密钥类型不同分为两类:对称加密和非对称加密
对称加密算法常见的包括:DES、3DES、AES
非对称加密算法常见的包括:RSA、DSA、ECC

AES:Advanced Encryption Standard,是一种区块加密标准。
AES加密是在4*4的字节矩阵上运作的,这个矩阵叫做“体state”,其初值是一个明文区块。若需要加密的数据不是16字节的整数倍,则后面补位至16的倍数。若正好是16的倍数,则后面再补16字节。(padding采用PKCS7Padding

python:

length = 16 – (len(message) % 16)
message += chr(length)*length


加密时,各轮AES加密循环(除最后一轮外)均包含4个步骤:
  1. AddRoundKey —矩阵中得每一个字节与下一轮的RoundKey做异或运算
  2. SubBytes — 非线性的替换函数,在S-Box中用对应位置的值替换当前字节值
  3. ShiftRows — 将矩阵中的每一行做循环移位
  4. MixColumns — 混合每个矩阵中每列的操作

AES_Encryption_Process

上图来自波士顿大学的Howard Straubing做了这么一个动画来展示AES加密算法的演示(援引自coolshell http://coolshell.cn/articles/3161.html
在这个展示中对加密的过程和wiki中的描述看起来有些不同,其实是一样,都是在initial round时对Cipher key做一次或运算,然后9轮循环加密,最后再做一次替换函数,移位操作和异或运算。
每一轮做抑或运算的Round key值也是根据Cipher key推算出来的。
AES_key
在每次计算第 4*i+1列时都会将 4*i列向上移位1位,然后根据S-Box做SubBytes,然后和4*i-3列异或,再和Rcon左边一列异或。
计算非4*i+1列(如j)时则直接计算列(j-1) 异或 列(j-4)得到。
可见整个AES state加密过程中Cipher Key对加密结果起到关键作用,AES也是通过Cipher Key来做对称解密的。
AES的密钥长度可以为128,192,256 Bytes,分别对应的加密Round数为10,12,14
而这种情况每一个state对应一个加密的4*4的块。state之间不存在互相影响的关系,这样在加密时可以并行计算,但随之带来的问题可能会让对方根据字母的统计频次来破解CipherKey值。
因此AES在这个加密的基础上又分为以下几种mode:
  • ECB模式
每个state单独地进行加密,相同的明文state会得到相同的密文块
  • CBC模式
第一块明文会和初始化向量IV做异或再加密,之后的明文块都需要上一个密文块做异或再进行加密。这样不容易主动攻击,也不利用并行计算。
  • CFB模式
  • OFB模式

BASE64

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email、在XML中存储复杂数据。
MIME格式的电子邮件中,base64可以用来将binary的字节序列数据编码成ASCII字符序列构成的文本。使用时,在传输编码方式中指定base64。使用的字符包括大小写字母各26个,加上10个数字,和加号“+”,斜杠“/”,一共64个字符,等号“=”用来作为后缀用途。
编码”man”:
编码“Man”
base64 补位:
base64补位
文本为1Byte的A,相应的二进制上补4个0,生成QQ,对应文本缺少两个Byte到3的倍数,最后的Base64编码补2个=
文本为2Byte的BC,相应的二进制上补2个0,生成QKM,对应文本缺少一个Byte到3的倍数,最后的Base64编码补1个=