デバイス制御(ioctl)
read/writeでは表しきれないデバイス固有の操作を担うioctl。ファイルディスクリプタとコマンド番号を渡して、時計やシリアルなどのハードを直接叩く仕組みを確認する。
Linuxはデバイスをファイルとして扱う。/dev の下にあるファイルを open して read/write すれば、ディスクやシリアルにアクセスできる。だが「ボーレートを変える」「時計から時刻を読む」といった操作は、単なる読み書きでは表せない。そこを埋めるのが ioctl だ。
🧩 read/write の隙間を埋める
ioctl は「デバイス固有の命令」を送るためのシステムコールだ。何をするかはコマンド番号で指定し、必要なら追加の引数(多くはポインタ)を渡す。デバイスの数だけコマンドがあり、汎用の read/write では届かない設定・問い合わせを担う。
💡
ポイントEX: `int ioctl(int fd, int cmd, ...);`。`fd` は対象デバイスを open して得たディスクリプタ、`cmd` が実行したい操作の番号。3つ目以降はコマンドが要求する引数で、構造体へのポインタを渡すことが多い。
🧩 具体例:ハードウェア時計を読む
たとえばリアルタイムクロック(RTC、電源を切っても時を刻む時計)から現在時刻を読むには、`/dev/rtc0` を open して、時刻取得を意味するコマンド番号で ioctl を呼ぶ。結果は時刻を表す構造体に書き込まれて返る。
💡
ポイントNOTE: `/dev/rtc0` のようなデバイスは一般ユーザでは開けないことが多く、root権限(sudo)が要る。権限で弾かれたら open が -1 を返す点は通常のファイルと同じ。
💡
ポイントTIP: どんなコマンド番号が使えるかはデバイスドライバ次第で、共通の一覧はない。だから ioctl は「そのデバイス用のヘッダに定義された定数」とセットで使う。汎用性より、各ハードの事情に合わせる出口だと捉えるとよい。
💡
ポイントANALOGY: read/write が「どのお店でも通じる共通の注文(読む・書く)」なら、ioctl は「その店だけの裏メニューを番号で頼む」感覚。番号の意味は店(デバイス)ごとに違い、メニュー表(ヘッダ)を見ないと頼めない。
この項目に出てくる用語
ioctlあいおーこんとろーる
デバイス固有の操作を行うシステムコール。
デバイスファイルでばいすふぁいる
デバイスをファイルとして見せる特殊ファイル。