ioctlサンプルプログラムを調べて、カーネルスペースとの通信方法を確認していました。プログラムでは、WRITE_IOCTLがコマンドとして使用されます
_#define WRITE_IOCTL _IOW(MY_MACIG, 1, int)
ioctl(fd, WRITE_IOCTL, "hello world")
_
_IOW(MY_MACIG, 1, int)
とは何か理解できません。これが私がプログラムをダウンロードしたところからのリンクです。私を助けてください。 http://people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-4.html
ご存知かもしれませんが、Linuxデバイスドライバーの本で説明されているように、ioctlは一意である必要があります。
Ioctlコマンド番号は、正しいコマンドを間違ったデバイスに発行することによって引き起こされるエラーを防ぐために、システム全体で一意である必要があります。このような不一致は起こりそうになく、プログラムは非FIFOまたはオーディオデバイスなどのシリアルポート入力ストリーム。各ioctl番号が一意である場合、アプリケーションは意図しない処理に成功するのではなく、EINVALエラーを受け取ります。
さらに、ioctlは、カーネルスペースへのデータの書き込みやカーネルスペースからのデータの読み取りを要求する場合があります。
Ioctlを実行する独自のドライバーを作成するときは、ioctlコマンドでこれらすべてを説明する必要があります。
_IO、_IOW、_IOR、_IORWは、一意のioctl識別子を作成し、必要なR/Wに必要な機能(方向)を追加するためのヘルパーマクロです。
これらは、次のパラメーターを取ることができます:マジック番号、コマンドID、および渡されるデータ型(存在する場合)
マジックナンバーは、LDDの本の引用に記載されているようなエラーをドライバーが検出できるようにする一意の番号です。
コマンドIDは、どのコマンドを呼び出す必要があるかをdirverが理解するための方法です。
最後のパラメーター(タイプ)は、カーネルがコピーされるサイズを理解できるようにします。
お役に立てれば。
PS:Linuxデバイスドライバーの本(第6章)で詳細を確認できます https://lwn.net/images/pdf/LDD3/ch06.pdf
http://www.circlemud.org/jelson/software/fusd/docs/node31.html から:
Linuxヘッダーファイル/usr/include/asm/ioctl.h
は、ioctlコマンド番号を作成するために使用する必要があるマクロを定義します。これらのマクロは、次の3つの引数のさまざまな組み合わせを取ります。
コマンド番号の生成に使用されるマクロは次のとおりです。