Yash 2 その 99: 履歴ファイルの新しい形式と共有 その 2
昨日の続き。
大きくなった履歴ファイルをいつ削るかだが、これは履歴番号がラップするとき (番号が一巡して 1 に戻るとき) とシェルを終了するときに行うという風に今は考えている。もしかするとシェルを起動したときにも行うようにするかもしれない。
削る際には、ファイルを最初から全部書き直すようにする。いらなくなった古い履歴項目を削りたいのであって、それらはファイルの初めの方にあるのだから、ファイルの一部を書き換えて済ますということは原理的にできない。ファイルを最初から書き直す度に、ファイルの改訂番号を増やす。改訂番号はファイルの一行目に書いておく番号で、この番号で書き直しの回数を知ることができる。
シェルが履歴ファイルを読む際には、先ず一行目の改訂番号が変わっていないかどうかを見る。変わっていなければ、前回読み終わったところの後の部分を読み直すだけでよい。変わっていれば、(どこまでが前回読んだ部分なのかはもう分からないので) ファイル全体を読み直す。
ファイルの読み書きをロックしているとき以外は、ファイルには常に他のプロセスが書き込みを行う可能性があるので、一般に、シェルが履歴ファイルを読み込んだ後ロックを外した時点でシェルが持っているデータは古くなっていると考えねばならない。従って、履歴ファイルへの書き込みは、先ずファイルを読んでシェルが持っているデータを更新した後、そのロックを外さずに続けて行わなければならない。こうしないと、本来同一たるべき履歴データがプロセスによって異なってしまう虞がある。
| 固定リンク
コメント