最初にioctlのコマンドと引数構造体を定義したヘッダファイルは、次のように インクルードしておく。
#include "dio_ioctl.h"
リセットコマンド(DIO_RESET
)を実行するときは、ファイルデスクリプタ
とそのコマンド番号だけを引数に指定してioctlを実行する。実行に失敗した場
合には戻り値が負になる。
ret = ioctl(fd, IOCTL_DIO_RESET); if (ret < 0) printf("[ioctl reset] no Shippai = %d\n", ret); |
ランダム入力のコマンド(DIO_INPUT
)を実行するときは、
あらかじめDIO_POINT
構造体型の変数を使って入力開始点と入力点数を設定し
ておいてからioctlを実行する。そのときのioctlの第3引数には
DIO_POINT
構造体型の変数のアドレスを指定する。
DIO_POINT point; point.start_point = 3; point.data_count = 14; ret = ioctl(fd, IOCTL_DIO_INPUT, &point); if (ret < 0) printf("[ioctl input] no Machigai = %d\n", ret); |
ランダム出力のコマンド(DIO_OUTPUT
)を実行するときは、出力に指定し
たデータ点数分のデータを、あらかじめデータ配列に格納しておく。
DIO_POINT point; point.start_point = 15; point.data_count = 4; point.data[0] = 1; point.data[1] = 0; point.data[2] = 1; point.data[3] = 0; ret = ioctl(fd, IOCTL_DIO_OUTPUT, &point); if (ret < 0) printf("[ioctl output] no Machigai = %d\n", ret); |
L.D.Dの「5.1 ioctl」で注意しているように、このioctlシステム コールに限っては、第3引数に指定するデータは実行時に全くチェックされない。 コマンド番号のマクロに引数型の指定をしているが、実際にはioctlの実 行時に異なる引数を指定しても全くチェックされない。これは、多様なデバイス に対応するためにやむをえないことであると考えられる。