|
とほほさんとこの話題が出てますね(笑い) そのとほほさんのラウンジの質問を見ていて思い出したのですが、 (質問自体は、ホームぺージの作成には関係なさそう…) statが返す構造体のmodeの上位7ビットはどのような意味がある のでしょうか? 上位3ビットは、 0x8000 ブロックデバイス 0x4000 ディレクトリ 0x2000 キャラクタデバイス であることは分かったのですが、下位の 0x1000 0x0800 0x0400 0x0200 が分からないのです。 検索で探しても、ビットの意味まで記述した記事が見つけられなくて…(^^; ところで、perlのCGIで、 (stat(STDOUT))[2]&0x2000 (stat(STDOUT))[2]&0x8000 を調べて見ると、下の方が真となって、ブロックデバイスと 出たのですが(STDINも同じ)、これってウチのWebサーバーが CGIの標準出力を一旦ファイルにリダイレクトしている ということなのでしょうか? |
|
あれから、ls のソースを調べればいいと考えたのですが、 その中で、S_IFDIR とかを #defined した stat.h を探すのに 手間取ってしまいました。 (やはり、grep一発でカタが付く環境が羨ましい…(^^;) それはともかく、各ビットが意味を持つ訳ではなく、 0xF000 type of file mask でマスクした値が以下の意味を持つようです。 0x1000 named pipe (fifo) FIFO 0x2000 character special キャラクタ型スペシャルファイル 0x4000 directory ディレクトリ 0x6000 block special ブロック型スペシャルファイル 0x8000 regular 通常ファイル 0xA000 symbolic link シンボリックリンクファイル 0xC000 socket ソケットファイル 0xE000 whiteout 0x0200 save swapped text even after use ところで、最後の2つは何なんでしょうか? |
|
> ただ、私の周りにはちょっと偏屈な技術者が多く、人間性は信じら > れない人がおおいです。 ん〜、まぁ初心者の程度にもよるかと。僕の場合、自分で調べようと しない人、一度聞いたことを覚えようとしない(メモを取らない)人には、 教えたくないですね。 もちろん、 > 初心者を馬鹿にしきった口振りや態度 がよろしくないのは当然ですが、教えをられる側の程度にも よるのではないかと思います。 > たとえば、とほほさんとは何度かメールのやり取りをしてますが、 > プログラマーな人なのに、おおらかな人間性を感じました。 いや〜僕はあんなに心が広くないので(^^; ちなみに僕は他人に(直接面と向かって)教えてると、だんだん 不機嫌になってきますので、あまり教えないようにしてます(笑)。 |
|
> その中で、S_IFDIR とかを #defined した stat.h を探すのに > 手間取ってしまいました。 stat(2)を見るのが一番早いんじゃないでしょうか。 > 0x0200 save swapped text even after use sticky bitです。chmod 1755、chmod u+t などとすればこのビットを立てられます。 以下、知ってたらごめんなさいな説明。 昔のUNIXでは仮想記憶はなく、実メモリと HDD上のスワップ領域の 2本立てでした。で、sticky ビットが立っているファイル(実行ファイル?) のテキスト領域は、実行後もスワップ領域に保持され、再実行する際は 高速に実行できるようになっていました。つまり頻繁に使うプログラムの stickyを立てておけば高速に実行が可能だったわけです。 しかし、現在のコンピュータはキャッシュや仮想領域が進化したので、 stickyビットの重要性はなくなりました。FreeBSDではファイルに 対する stickyビットは無視されています。 # ここらへんは、正しいことを書いているかどうか自信がありません。 一方ディレクトリに対する stickyはちゃんと意味があって、 誰でもその下にファイルを作成することはできるけど、削除する際は ファイルのオーナーしか削除できないという意味があります。 /tmp がいい例ですね。 % ls -ld /tmp drwxrwxrwt 18 bin bin 1536 May 30 07:57 /tmp/ > 0xE000 whiteout うーん、ローカルの全ファイルに対して、このビットが立ってるか どうか調べてみたんですが、1つもありませんでした。なんでしょうね? > 下の方が真となって、ブロックデバイスと > 出たのですが(STDINも同じ) 僕のまわりのFreeBSD/Solarisでは、STDIN/STDOUTともに、普通の状態だと キャラクタデバイス(ttyですな)、ファイルにリダイレクトするとregular、 パイプならFIFOになりました。CGI上で実行すると、IN/OUTともFIFOでした。 # http://X68000.startshop.co.jp/~68user/tmp/mode.txt # http://X68000.startshop.co.jp/~68user/tmp/mode.cgi > これってウチのWebサーバーがCGIの標準出力を一旦ファイルに > リダイレクトしているということなのでしょうか? mmさんのところってHPですから(でしたよね?)、実装の違いがあるの かもしれないので、僕の知識では何とも言いがたいです。 |
|
>stat(2)を見るのが一番早いんじゃないでしょうか。 あっ、すいません、以前教えて頂いた、 http://www.jp.freebsd.org/man-jp/search.html で、stat を検索すると、 マニュアルがみつかりませんでした。"stat.[1-9n]" という警告が出たんで、こっちは諦めてたのですが、 ウチのサーバーの man にはありました…(^^; ただし、ビットの意味までは書いてないです…× ところで、この stat(2) の (2) とかの数字は、どういう 意味なのでしょうか? 以前から少し気にはなってたんですが、ついつい放ったらかし にしてました…(^o^;ゞ >sticky bitです。chmod 1755、chmod u+t などとすれば >このビットを立てられます。 あっ、sticky bitと聞いて思い出しました(^^; swapの話や/tempの例も読んでたのですが、 昨日は連想が全く働きませんでした…すいませんですm(__)m >以下、知ってたらごめんなさいな説明。 とんでもないです。知らない可能性の方が高いので、 お手数でなければ、ぜひ今後ともよろしくお願いしますm(_~_)m >どうか調べてみたんですが、1つもありませんでした。なんでしょうね? ls のソースを見てると、S_IFDIRに'/'、S_IFSOCKに'='という感じで、 S_IFWHTには、'%'を付けてるので、何か意味があるんでしょうね。 とにかく、下位9ビットの上の3ビットは 01000 sticky bit 02000 SGID 04000 SUID ということで、8進で書いたら、UIDとかとの関連で思い出しました(^^; (modeはやはり8進の方が分かり易い…) >CGI上で実行すると、IN/OUTともFIFOでした。 私もそれを期待してたのですが… それはともかく、先にウチで実行したCGIはマスクが 間違ってたので、mode.cgi を実行してみました。 環境は、HP-UX Netscape-Enterprise/2.01b です。 # http://www2s.biglobe.ne.jp/~cru/test/mode.cgi 1100000 000000000 is SOCKET 1100000 000000000 is SOCKET ウッソー? なんで、ソケット?? 実は、nph-cgiで実行されてて、WWWサーバーの代わりに ラッパーがヘッダを付加してるとか??? ちなみに、Windows95での実行結果です。 C>perl mode.cgi 0010000 000000000 is CHAR_DEV 0010000 000000000 is CHAR_DEV C>perl mode.cgi < file1 >file2 C>cat file1 | perl mode.cgi | more 1000000 110110110 is REG_FILE 1000000 110110110 is REG_FILE ついでに、Win95 のJava WWWサーバーでの実行結果 0001000 000000000 is FIFO 0001000 000000000 is FIFO あれ? is REG_FILE を予想したのですが…?? |