MTIO(4) — NEWS-OS Programmer’s Manual
名称
mtio − 磁気テープインターフェース
解説
以降の解説は、トランスポートとコントローラを一組にして述べています。 ファイル mt0, ..., mt7 は 800bpi で、 mt8, ..., mt15 は 1600bpi で、 mt16, ..., mt23 は 6250bpi です。また、ファイル mt0, ..., mt3、 mt8, ..., mt11、 mt16, ..., mt19 は、ファイルがクローズした時にリワインドを行います。 他のファイルでは行いません。 書き込み用にオープンされたファイルがクローズされたとき、 エンドオブファイルが 2 つ書き込まれます。 テープがリワインドされないとき、ヘッドは 2 つのテープマークの間に置かれます。
標準テープは、エンドオブファイルで終わる、 1024 バイトのレコードの並びを含みます。 可能性としては、効率的ではありませんが、 他のファイルと同様に扱うことができます。 シークや、1 度に 1 バイトずつの読み書きは可能ですが、 非常に小さい単位での書き込みは、 莫大なレコードギャップを作る傾向があるので、お薦めできません。
mt ファイルは、テープを通常のファイルと同じ方法でアクセスするときに便利です。 他の多くの ioctl 操作は、raw 磁気テープに対して行われるものです。 次の定義は、<sys/mtio.h> にあります。 他のシステムのテープを扱ったり、特に長いレコードを読み書きする場合には、 ´raw’インターフェースを用いるとよいでしょう。 対応するファイルは rmt0, ..., rmt23, ですが、正規のファイル(ブロックインターフェースのファイル)と同様の 意味を持つマイナーデバイス番号が付きます。
/∗
∗ 磁気テープ I/O コントロールコマンドの構造体と定義
∗/
/∗ MTIOCTOP 用の構造体 − 磁気テープ操作コマンド ∗/
struct mtop {
short mt_op;/∗ 以下に定義した操作 ∗/
daddr_tmt_count;/∗ 回数 ∗/
};
/∗ 操作 ∗/
#defineMTWEOF0/∗ エンドオブファイルレコードを書く ∗/
#defineMTFSF1/∗ 次のファイルに進める ∗/
#defineMTBSF2/∗ 前のファイルに戻す ∗/
#defineMTFSR3/∗ 次のレコードに進める ∗/
#defineMTBSR4/∗ 前のレコードに戻す ∗/
#defineMTREW5/∗ リワインド (巻き戻し) ∗/
#defineMTOFFL6/∗ リワインドしてドライブをオフラインにする ∗/
#defineMTNOP7/∗ なにも操作しない、ステータスのみセット ∗/
#define MTCACHE 8 /∗ コントローラのキャッシュをイネーブルにする ∗/
#define MTNOCACHE 9 /∗ コントローラのキャッシュをディスエーブルにする ∗/
#ifdef sony_news
#define MTRETEN 10 /∗ テープをリテンション (巻き直し) する ∗/
#define MTERASE 11 /∗ 全テープを消去する ∗/
#endif /∗ sony_news ∗/
/∗ MTIOCGET 用の構造体 - 磁気テープのステータスを得るコマンド ∗/
struct mtget {
shortmt_type;/∗ 磁気テープデバイスの型 ∗/
/∗ 次の 2 つのレジスタは、デバイスに依存している ∗/
shortmt_dsreg;/∗ "ドライブステータス"レジスタ ∗/
shortmt_erreg;/∗ "エラー"レジスタ ∗/
/∗ デバイスに依存するレジスタの終わり ∗/
shortmt_resid;/∗ 残りカウント ∗/
/∗ 次の 2 つは、現在は実装されていない ∗/
daddr_tmt_fileno;/∗ 現在のファイル番号 ∗/
daddr_tmt_blkno;/∗ 現在のブロック番号 ∗/
/∗ 未実装部分の終わり ∗/
};
/∗
∗ mt_type バイト定数
∗/
#defineMT_ISTS0x01
#defineMT_ISHT0x02
#defineMT_ISTM0x03
#defineMT_ISMT0x04
#defineMT_ISUT0x05
#defineMT_ISCPC0x06
#defineMT_ISAR0x07
/∗ 磁気テープ I/O 制御コマンド ∗/
#defineMTIOCTOP_IOW(m, 1, struct mtop)/∗ 磁気テープ操作 ∗/
#defineMTIOCGET_IOR(m, 2, struct mtget)/∗ テープステータスを受け取る ∗/
#ifndef KERNEL
#ifdef sony_news
#define DEFTAPE "/dev/nrst00"
#else /∗ sony_news ∗/
#define DEFTAPE "/dev/rmt12"
#endif /∗ sony_news ∗/
#endif
read、 write コールは、テープの次のレコードを読み書きします。 write の場合は、レコードの長さは与えられたバッファと同じになります。 read の場合は、バッファサイズより大きくない限り、 レコードサイズが読み込まれたバイト数として返されます。 レコードサイズがバッファサイズより長い場合はエラーとなります。 raw テープでの I/O シークは無視されます。 テープマークが読まれると、バイトカウントが 0 で返されますが、 さらに読むと新しいテープファイルの最初のレコードが読み込まれます。
関連ファイル
/dev/rst??
/dev/nrst??
/dev/anrst??
/dev/rmt?
関連事項
mt(1), tar(1), fd(4), sd(4), st(4)
バグ
ステータスはデバイスに依存しない形式で返すべきです。 スペシャルファイルの名前は名前はもっと一貫性のある 覚えやすいものにするべきです。
NEWS-OSRelease 4.2.1R