filenoで、ファイルハンドルを知ろう。

のっけからあれなんですが、正確にいうとファイルの記述子(descriptor)を知ろうです。

printf("STDIN  no:%s\n",fileno(STDIN));
printf("STDOUT no:%s\n",fileno(STDOUT));
printf("STDERR no:%s\n",fileno(STDERR));
printf("DATA   no:%s\n",fileno(DATA));

open(IN1, "+> ./a");
printf("IN1    no:%s\n",fileno(IN1));
open(IN2, "+>./b"); 
printf("IN2    no:%s\n",fileno(IN2));
open(IN3, "+>./c"); 
printf("IN3    no:%s\n",fileno(IN3));
close IN1;
open(IN4, "+>./c"); 
printf("IN4    no:%s\n",fileno(IN4));
open(IN5, "+>./c"); 
printf("IN5    no:%s\n",fileno(IN5));

__DATA__
STDIN  no:0
STDOUT no:1
STDERR no:2
DATA   no:3
IN1    no:5
IN2    no:6
IN3    no:9
IN4    no:5
IN5    no:10
  1. システムは、この数値を見てどこへ読み書きするかを判断しているようです。
  2. STDINからDATAまでは固定っぽいです。(4番目はなんだろう…。)
  3. ファイルハンドルをいくつも開き続けていくと記述子の数値は上がっていきます。
  4. 閉じると、その記述子がまた使えるようになります。
  5. ハンドルが開けていない場合は、undefになります。
  6. ファイルハンドルの名前が違っても、記述子が同じだったらそのハンドルは同じです。
if (fileno(THIS) == fileno(THAT)) { #名前違うけれど中身同じ。
        print "THIS and THAT are dups\n";
}

fileno - perldoc.perl.org

まぁ、なんでこんな話をしたかというと。
DATAの記述子を確認すると通常であれば3が返されるんですが、
undefで返ってきていたんですね。
で、なんでかなと調べたので少しまとめてみました。

ちな、undefが返ってきていた理由は、使用していたモジュールがDATAハンドルをcloseしていて使えなくしていたってところです。