Shellスクリプトはftk関数を実現します。


「古いSys IPCにはいくつかの効果的な用途があります。三つのIPCオブジェクトはメモリ、信号、メッセージを共有する。これらのオブジェクトがIPCに使用される場合、それぞれのオブジェクトにキーを作成する必要があります。理論的にはIPC Keyを定義する際には任意の好きなKeyを使うことができますが、他のプログラムとの定義の重複を避けるために、UNIX/Linuxでは使用 key_が一般的です。t ftok関数は、比較的一意のKey値を生成する。しかしながら、「すべての人はSystem V IPCが嫌いです。パンチングテープよりも遅く、ファイルシステムとは全く関係のないかわいそうな名前空間を使って、人間の嫌な数字を使ってその対象に名前をつけています。また、自分で自分のオブジェクトを忘れています。光のメモリを使ってから問題が発見されないように、神様にお願いします。プロセス監視/自動的にBash Shellスクリプトを再起動するには、シナリオ内で現在のプログラムにハードコード化するKey値は良い方法ではないはずです。同じアルゴリズムのftk関数を実現するのが一番いいです。

#!/bin/sh
let key=0
function ftok() {
    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
        return 1;
    fi

    let st_ino=${str_st_ino}
    let st_dev=${str_st_dev}

    #
    let key1=${st_ino}\&16#FFFF
    let key2=${st_dev}\&16#FF
    let key2=${key2}\<\<16
    let key3=${proj_id}\&16#FF
    let key3=${key3}\<\<24
    let key=${key1}\|${key2}
    let key=${key}\|${key3}
}

function echohelp(){
    echo "ftok generator"
    echo "Usage:ftok pathname projid"
    exit 5
}

if [ $# -ne 2 ] ; then
    echohelp
fi

sPathName=$1
let nProjectID=$2

if [ "${sPathName:0:1}" != "/" ] ; then
    sPathName=${PWD}/${sPathName}
fi

if ! test -f ${sPathName} ; then
    echo "No File Found![${sPathName}]"
    exit 4
fi

ftok "${sPathName}" "${nProjectID}"
echo ${key}