Lions' 本読み (145)
朝練。creat 手続きのあたりの記述 (396p) 確認。
namei はパス名を inode なポインタに変換、とのこと。
5786 ip = namei(&uchar, 1);
で、戻りが NULL 値であればエラー又はその名前のファイルが存在しない、ということを示す、とあります。
5787 if(ip == NULL) {
で、エラーでなければ inode なオブジェクトを生成して open1 を呼び出してます。
5790 ip = maknode(u.u_arg[1]&0777&(~ISVTX)); 5791 if (ip==NULL) 5792 return; 5793 open1(ip, FWRITE, 2);
で、namei の戻りが NULL でない場合は open1 に 1 を渡して云々
5794 } else 5495 open1(ip, FWRITE, 1);
open1 手続きの trf な引数の値が 1 又は 2 の場合、creat 経由の呼び出しなので基本的にファイルは生成される形、なんですが以下の記述の解説で
5824 if(trf) 5825 itrunc(rip);
ここでは、この検査を (trf == 1) に変更したほうがコードの効率がよくなる。そうなることを確認してほしい。
Lions' Commentary on UNIX より引用
という記載があります。上記では trf が 0 以外の場合に、という形になるのですが 2 の場合には creat で inode なオブジェクトが maknode で生成されたばかり、という事があるので初期化は不要という事で良いのかどうか。
つうか itrunc 手続き (7414) 見てみたら inode なオブジェクトの i_addr な配列 (ディスクブロック) に対して O(n^2) なソレでバッファの読み込みおよび開放な処理をなさってらっしゃいます。
これは確かに 1 の場合のみ、の方が効率は良いですね。
ちなみに
シェルな例で言えば
$ ls $ echo 1 > hoge
というのが trf が 2 のケイスですね。そして
$ ls hoge $ echo 2 > hoge
というのが trf が 1 のケイスになるはず。
継続
open1 手続きはもう少しきちんと確認の方向で。