Shell脚本实现ftok函数
“古老的SysIPC仍然有好几种有效的用途。三种IPC对象是共享内存,信号灯和消息。”当使用到IPC的这些对象时,你需要为每个对象创建一个Key。虽然理论上来说我们在定义一个IPCKey的时候可以使用任意自己喜欢的Key,但为了避免与其他的程序产生定义重复,在UNIX/Linux中一般会使用key_tftok(constchar*path,intid)函数来生成一个比较唯一的Key值。然而,“每个人都讨厌SystemVIPC。它比打孔纸带还慢,使用与文件系统完全无关少得可怜的名字空间,使用人类讨厌的数字给它的对象命名,并且还常常自己忘记自己的对象,你的系统管理员经常需要用ipcs(1)查找那些丢失了的对象并且用ipcrm(1)删除它们,还得求老天保佑不要在用光内存以后才发现问题。”对于来实现进程监控/自动重启BashShell脚本来说,在脚本里面硬编码进当前程序用到的Key值肯定不是个好办法,最好是实现相同算法的ftok函数。
#!/bin/sh letkey=0 functionftok(){ pathname=$1; proj_id=$2;
str_st_ino=`stat--format='%i'"${pathname}"2>/dev/null`; str_st_dev=`stat--format='%d'"${pathname}"2>/dev/null`; if["x${str_st_ino}"="x"-o"x${str_st_dev}"="x"];then return1; fi
letst_ino=${str_st_ino} letst_dev=${str_st_dev}
#注意这里的位操作运算符需要加转义符 letkey1=${st_ino}\&16#FFFF letkey2=${st_dev}\&16#FF letkey2=${key2}\<\<16 letkey3=${proj_id}\&16#FF letkey3=${key3}\<\<24 letkey=${key1}\|${key2} letkey=${key}\|${key3} }
functionechohelp(){ echo"ftokgenerator" echo"Usage:ftokpathnameprojid" exit5 }
if[$#-ne2];then echohelp fi
sPathName=$1 letnProjectID=$2
if["${sPathName:0:1}"!="/"];then sPathName=${PWD}/${sPathName} fi
if!test-f${sPathName};then echo"NoFileFound![${sPathName}]" exit4 fi
ftok"${sPathName}""${nProjectID}" echo${key}