UNIXシステムには通常様々な装置が接続されています。それらはすべて/devと いうディレクトリにデバイススペシャルファイルとして登録されています。試 しに次をやってみましょう。
% ls -l /dev -rwxr-xr-x 1 root 12739 Jul 24 1992 MAKEDEV* crw-rw-rw- 1 root 69, 0 Mar 31 1994 audio ... crw-r----- 1 root 17, 0 Mar 31 1994 rsd0a crw-r----- 1 root 17, 1 Mar 31 1994 rsd0b ... brw-r----- 1 root 7, 0 Mar 31 1994 sd0a brw-r----- 1 root 7, 1 Mar 31 1994 sd0b
ここでMAKEDEVは装置を追加するシェルプログラムです。それ以外のファイル は属性がcかbで始まっています。cはキャラクター型デバイス、bはブロック型 デバイスを表わします。キャラクター型デバイスは単なるバイト列の湧き口も しくは沈み口で、生(RAW)デバイスと呼ばれることもあります。オーナーの次 のファイルサイズのところに数字が二つ並べてありますが、これがUNIXの入出 力システムで装置を識別する番号です。メージャー番号とマイナー番号と呼ば れています。例えばsdというのはSCSIインターフェースにつながれたハードディ スクを表わしますが、メージャー番号7を持っています。メージャー番号には それぞれデバイスドライバーが割り当てられています。個別のディスク(正確 にはディスクのパーティション)はマイナー番号で区別されています。rsdとい う装置はsdをキャラクター型デバイスとして扱うときのために(例えばバック アップのためなど)用意されたデバイスです。良く使う装置にはst(SCSIに繋が れたテープ装置)、sr(SCSIに繋がれたCDROM)、fd(フロッピーディスク)、tty (端末)、pty(疑似端末)などがあります。特殊なものにはnullがあります。各々 man 4(HP-UXではman 7。以下同じ)で見てみましょう。(以上の名前はSUN-OSの 場合です。ULTRIXの場合はrzがSCSIディスク、tzがSCSIテープになります。 HP-UXの場合は/devの下に装置の種類ごとにサブディレクトリが用意されてい ます。/dev/dsk、/dev/f loppy、/dev/rmtなどがあります。)
このように様々な装置が繋がれているわけですから上述の入出力動作以外に 個々の装置特有の操作というものが必要になります。そのためのシステムコー ルがioctlです。ioctlシステムコールは引数にファイル記述子、リクエストコー ド、リクエストを実行するためのデータを与える構造体へのポインターを指定 します。構造体はリクエストごとに異なっています。どのような操作が出来る かはmanページのセクション4にある最後にioの文字のついた項目を調べればわ かります。ディスクに対するものであればdkioです。ソケットに対しては sockioです。磁気テープに関するものはmtioです。man 4 introで見てくださ い。例えば磁気テープを巻き戻すには
#include <sys/mtio.h> struct mtop cmd; cmd.mt_op = MTREW; cmd.mt_count = 1; ioctl( fd, MTIOCTOP, &cmd );
という風になります。構造体mtopは磁気テープデバイスドライバーによって解 読されるオペレーションを定義するものです。こういったやり方はデバイスド ライバーごとに違っていますのでmanページやマニュアルを調べる必要があり ます。VMEやCAMACも特殊な操作をドライバーを通して行ないます。