ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
UNIXのシステムコールの一つで、デバイスを制御する際に用いるもの。
#include <sys/ioctl.h>
int ioctl(int d, int request, ...);
ioctl()関数呼び出しはVersion 7 AT&T UNIXから登場し、以降引き継がれた。
但し、比較的新しいOS(例えばBSD系、Linux)では、二番目の引数は単なるintではなくunsigned longである。
ioctl()関数は、open()されたスペシャルファイルを構成するデバイスの制御を行なうものである。特に、キャラクターデバイスでよく用いられている。
一番目の引数dは、open()で得られたファイルディスクリプターとする。
二番目の引数requestは、デバイスごとに固有のリクエストコードで、これによって機能を選択する。
三番目以降の引数は、必要に応じて与えられる。型はvoid *であるが、古いUNIXではchar *であった。
環境に依存せずにrequestの値を作るため、_IO、_IOW、_IOR、_IOWR、という四つのマクロが用意されている。
一番目の引数groupは、ドライバー等を識別するための識別子である。本来はドライバーと一対一であるべきだったが、今やドライバーは大量にあるため、番号は他のドライバーと共用となっている。
二番目の引数numは、各ioctlを区別するためのシーケンス番号である。
group、numは、識別という意味ではさほど重要ではない。実際、group、numは競合が頻発しているが、競合しても実際には動作に問題はない。なぜなら、デバイス自体はopen()の時点で一意に特定されているため、そのデバイス内で機能ごとにrequestが一意でさえあれば、何の問題も無いからである。
基本的には、誤って他のデバイスに対してioctlをしていないか、をドライバー側でチェックする目的で用いられている。
一般的な実装では、requestの値の上位3ビットがin/out/voidのフラグ、続く13ビットが長さ(sizeof)で、続く8ビットがgroup、最下位8ビットはnumとなる。
OSにより差はあるがフラグは一般的に次のような定義になっている。
#define IOC_VOID (unsigned long)0x20000000 #define IOC_OUT (unsigned long)0x40000000 #define IOC_IN (unsigned long)0x80000000 #define IOC_INOUT(IOC_IN|IOC_OUT)
_IORはIOC_OUT、_IOWはIOC_IN、_IOWRはIOC_INOUTとなり、引数の無い_IOはIOC_VOIDである。INもOUTも無ければVOIDとすればフラグは2ビットで事足りるはずだが、VOIDに1ビット使うように実装されたため、今もこのような仕様となっている。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます