• 検索結果がありません。

ファイルのデータ構造

ドキュメント内 新潟大学学術リポジトリ (ページ 127-131)

/dev/pty* · · ·擬似端末(仮想的なデバイス)

/dev/console · · · 管理用の端末(仮想的なデバイス)

/dev/null · · ·ヌル。書き込むと全てを吸い込み、読み込むとEOFが返ってく る仮想的なデバイス。

'

&

$

% 補足:

コマンドの出力をどこにも出したくない時はリダイレクショ ンで/dev/nullに書き出せば良い。 また、空ファイルを作 りたい時は/dev/nullからコピーすれば良い。

• 特殊ファイルを作るために mknod コマンド (MaKe NODe)が用意されている。(スー パーユーザしか使えない。) これに対応したmknod() というシステムコールもある。

ソケット:

• プロセス間通信の際に、通信の窓口として機能する様に設けられた特別なファイル。

• 代表的なソケットとして次のようなものがある。

[motoki@x205b]$ ls -l /dev/{log,printer}

srw-rw-rw- 1 root root 0 Oct 4 20:48 /dev/log=

srw--- 1 root root 0 Oct 4 20:48 /dev/printer=

[motoki@x205b]$ ls -l /tmp/.X11-unix/X0

srwxrwxrwx 1 root root 0 Oct 4 20:48 /tmp/.X11-unix/X0=

[motoki@x205b]$

ここで、

/dev/logは システム管理用のメッセージを集めるためのソケットで、このソケット

に書き込まれたメッセージはsyslogd というデーモンに送られる。

/dev/printerは プリンタへの出力用のためのソケットで、このソケットに書き込ま

れたメッセージはlpd というプリンタデーモンに送られる。

/tmp/.X11-unix/X0は Xサーバと応用プログラムが通信するためのソケット。

名前付きパイプ:

• 普通のパイプでは、親子または兄弟関係にあるプロセス間でしか通信できない。 この 制約をなくして、任意のプロセス(別ユーザのプロセス間も可)をパイプで繋げるため に設けられた特別なファイル。 (=⇒ 14.5節)

• 名前付きパイプを作るにはmknodコマンドを使う。(特殊ファイルを作る時と同じコマ ンド。)

10.3 ファイルのデータ構造

吉沢 6.3.2-3 , 山口 (1992 )9.2-4 , D.A.Curry 13

i-ノード: ファイルの中身はデータブロック(固定長)の中に入れられるが、場合によっ ては複数あるデータブロックを1つのファイルとして組み立てたり、ファイルに関する 様々な属性・情報(名前以外)を保持したりするために、i-ノード(i-node)と呼ばれる構造 体が用意されている。 具体的には、i-ノードには次のような情報が含まれている。

(=⇒p.124の図)

•モード · · · ファイルの型、アクセスモード等の情報から成る。アクセスモードの変更

のためにはchmodコマンドやchmod( )システムコールが用意されている。また、

creat( ) や open( )システムコールでファイルを作成する際は、アクセスモー

ドをパラメータとして指定する。昔のBSDだと 次のような16ビットで構成され ていた。

15 12 11 10 9 8 6 5 3 2 0

型 S S t r w x

(user) r w x

(group) r w x (others) ここで、各々のビットの意味は次の通り。

(15〜12ビット目) ファイルの型を表す。

lsコマンドの表示 15〜12ビット目 ファイルの型 - 1000 通常ファイル

d 0100 ディレクトリファイル l 1010 シンボリックリンク b 0110 ブロック型特殊ファイル c 0010 文字型特殊ファイル

s 1100 ソケット

p 0001 名前付きパイプ

(11ビット目) set-user-IDビットと呼ばれる。このビットが立っていると、ファ イルとして格納されているプログラムが実行される時、(起動した人じゃな く)このファイルの所有者のユーザIDがプロセスの実効ユーザID として設 定される。ls -l時は、このビットが立っていれば所有者の実行モードはx がs に, -が Sに変わる。このビットを設定するにはchmodコマンドを使う。

(10ビット目) set-group-IDビットと呼ばれる。このビットが立っていると、

ファイルとして格納されているプログラムが実行される時、このファイルの グループIDがプロセスの実効グループIDとして設定される。

(9ビット目) stickyビットと呼ばれる。例えば、ディレクトリファイルの場合 は、このビットが立っていると、その中のファイルを消したり名前を変えた りするのがファイルの所有者に限定されるようになる。詳細は山口(1992上) 9.2.1節を参照。

(8〜6ビット目) ファイルの所有者自身に対するアクセスモード。

(5〜3ビット目) ファイルの所有者と同じグループ内のユーザに対するアクセス モード。

(2〜0ビット目) 他人に対するアクセスモード。

•ハードリンク数 · · · UNIXにおいては、1つのi-ノードとそこから参照されるデータ ブロック(群)を合わせたものが1つのファイルを構成すると考えられる。この中 にはファイルの名前は含まれない。ファイルの名前はそのファイルにアクセスす るディレクトリファイルが持っている。それゆえ、UNIXにおいては複数箇所の

10.3. ファイルのデータ構造 123

ディレクトリから1つのファイルに別のファイル名でアクセスするということも 可能である。

=⇒ ファイルの必要性を見るために、何か所から参照されているかをこのフ ィールドに保持する。 これが0になったら、このファイルのために使

われているデータブロックは全て解放される。

既に出来ているファイルやディレクトリに別名を付けるためにlnコマンドが用 意されている。

'

&

$

% 補足:

lsコマンドを-lオプション付きで実行した時、保護モードの次に表示される数 字が共用リンク数である。例えば、

[motoki@x205b]$ ls -al 合計 1896

drwxrwxr-x 4 motoki motoki 4096 Oct 5 10:52 ./

drwx--- 22 motoki motoki 4096 Oct 5 08:46 ../

drwxrwxr-x 2 motoki motoki 4096 Oct 4 20:49 C-Programs/

drwxrwxr-x 2 motoki motoki 4096 Oct 4 20:49 Figs/

-rw-rw-r-- 1 motoki motoki 36320 Sep 30 00:43 OS-OHP.aux -rw-rw-r-- 1 motoki motoki 219204 Sep 30 00:43 OS-OHP.dvi

...

[motoki@x205b]$

lnコマンドを使って(ハード)リンクの追加を行っていなければ 通常ファイルのリンク数=1,

ディレクトリのリンク数=(子ディレクトリの数)+2

となる。 各々のディレクトリには .. という親ディレクトリを意味する名前も . という自ディレクトリを意味する名前も登録され、親からだけでなく子ディレ クトリや自ディレクトリからの(ハード)リンクも自動的に作られる。

•ユーザID, グループID · · ·

•ファイルの大きさ · · · ファイル実体を構成するバイト数。

•最終アクセス時刻,最終更新時刻, i-ノード最終更新時刻 · · · 1970年1月1日0時0

分(グリニッジ標準時)からの経過時間。単位は秒。

•ディスクブロックアドレス · · · 「ディスクブロック」とはディスク上の連続領域に並 んだ物理的な入出力の単位のことで、磁気ディスクの場合はセクタを意味する。

具体的には、ディスクブロックはブロック番号で指定する。i-ノードの中にはブ ロック番号を格納するためにn = 8〜16個の領域が用意され、そのうち最初の n −3個の領域にはファイルを構成する最初のn−3個のデータブロック(直接 ブロックと言う)の番号が格納される。 ファイルが大きくn−3個のブロックに 入り切らない場合は、最初のn−3個に続くデータブロックの番号の列を格納し たデータブロック(1段間接ブロックと言う)を用意し、そのブロックの番号を i-ノードのn−2番目のブロック番号領域に格納される。それでも足りなければ、

更に「2段間接ブロック」,「3段間接ブロック」が構成され、それらの番号が i-ノードの n−1番目, n番目 のブロック番号領域に格納される。

'

&

$

% 補足:

Vine Linux2.1.5だと、i-ノードの構造体は/usr/include/linux/fs.hの中で次 の様に定義されている。

struct inode {

struct list head i hash;

struct list head i list;

struct list head i dentry;

unsigned long i ino;

unsigned int i count;

kdev t i dev;

umode t i mode;

nlink t i nlink;

uid t i uid;

gid t i gid;

...

union {

struct pipe inode info pipe i;

struct minix inode info minix i;

struct ext2 inode info ext2 i;

...

} u;

};

初期のUNIXと比べるとかなりの拡張(e.g.他の種類のファイルシステムも扱え るようにした)が為されていて、複雑になっている。

通常ファイルの構造:

モード リンク数 ユーザID グループID ファイルの大きさ 最終アクセス時刻

最終更新時刻 i-ノード最終更新時刻

直接ブロック の指定

1段間接ブロックの指定 2段間接ブロックの指定 3段間接ブロックの指定

・ ・

・ ・

・ ・

・ ・

・ ・

・ ・

・ ・

・ ・

・ ・

・ ・

1段間接ブロック

1段間接ブロック

1段間接ブロック

1段間接ブロック

2段間接ブロック

・ ・

・ ・

1段間接ブロック

1段間接ブロック 1段間接ブロック 2段間接ブロック

2段間接ブロック

3段間接ブロック データブロック

データブロック データブロック データブロック データブロック データブロック

データブロック データブロック

データブロック

データブロック

データブロック

データブロック

データブロック i-ノード

i-ノード 番号

i-ノード 番号 ディレクトリの データブロック

ディレクトリの データブロック

ドキュメント内 新潟大学学術リポジトリ (ページ 127-131)