[解決済み] ioctl - 無効な引数
2022-02-07 05:50:36
質問
私は
#define IOCTL_ALLOC_MSG _IO(MAJOR_NUM, 0)
#define IOCTL_DEALLOC_MSG _IO(MAJOR_NUM, 1)
をヘッダーファイルの中に入れてください。
と私が書いたドライバファイルの中にあります。
struct file_operations memory_fops = {
unlocked_ioctl: device_ioctl,
open: memory_open,
release: memory_release
};
int memory_init(void) {
int result;
/* Registering device */
result = register_chrdev(MAJOR_NUM, "memory", &memory_fops);
if (result < 0) {
printk("<1>memory: cannot obtain major number %d\n", MAJOR_NUM);
return result;
}
allocfunc();
printk("<1>Inserting memory module\n");
return 0;
}
int device_ioctl(struct inode *inode, /* see include/linux/fs.h */
struct file *file, /* ditto */
unsigned int ioctl_num, /* number and param for ioctl */
unsigned long ioctl_param)
{
/*
* Switch according to the ioctl called
*/
printk ( "<l> inside ioctl \n" );
switch (ioctl_num) {
case IOCTL_ALLOC_MSG:
allocfunc();
break;
case IOCTL_DEALLOC_MSG:
deallocfunc();
break;
}
return 0;
}
のように文字ファイルを作成しました。
mknod /dev/memory c 60 0
アプリの呼び出しに失敗する
int main(int argc, char *argv[]) {
FILE * memfile;
/* Opening the device parlelport */
memfile=fopen("memory","r+");
if ( memfile <0) {
printf ( " cant open file \n");
return -1;
}
/* We remove the buffer from the file i/o */
int ret_val;
if ( argc > 1 ) {
if ( strcmp (argv[1], "mem" ) ==0 ) {
ret_val = ioctl(memfile, IOCTL_ALLOC_MSG);
if (ret_val < 0) {
printf("ioctl failed. Return code: %d, meaning: %s\n", ret_val, strerror(errno));
return -1;
}
}
アプリを実行すると、"ioctl failed.と表示されます。リターンコードは -1, 意味: 無効な引数です" in : strerror(errno)
printkです。
Inserting memory module
fyi, 私は "/dev/memory" "memory" を異なる名前とメジャー番号の組み合わせで実験しましたが、無駄でした。
解決するには?
を渡すと
FILE*
から
ioctl()
関数は、ファイルディスクリプタを期待しますが、それは
int
.
少なくとも、ポインタをキャストによらずに整数に変換しているという大きな警告が出るはずですよね?
明らかな解決策は2つあります。
-
を使用します。
fileno()
関数でファイルディスクリプタを取得します。FILE*
. 次のようなものでなければなりません。ioctl(fileno(memfile), IOCTL_ALLOC_MSG)
. -
使用方法
open()
の代わりにfopen()
. この方法は、低レベルのコードを書いている場合に推奨される方法です。FILE*
が課すものです(すべてのバッファリングに関するものなど)。
関連
-
[解決済み】valgrind - サイズ8のブロックが割り当てられた後、アドレス ---- が0バイトになる。
-
[解決済み】式は、単純なポインタ演算を使用して完全なオブジェクト型へのポインタでなければなりません【重複】。
-
[解決済み】警告。この関数ではXが初期化されていない状態で使用される可能性があります。
-
[解決済み] [Solved] なぜこのようなエラーが発生するのでしょうか。「データ定義に型またはストレージクラスがない」?
-
[解決済み】C言語で多重定義を防ぐには?
-
[解決済み】「複数の定義」「最初に定義されたのはここです」エラーについて
-
[解決済み】宣言指定子で2つ以上のデータ型がある場合のエラー【非公開
-
[解決済み】Makefile:1: ***セパレータがありません。停止します。
-
[解決済み] rm, cp, mvコマンドで引数リストが長すぎるというエラーが発生する。
-
[解決済み] longをフォーマットするprintfの引数は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】strcmpが機能しない
-
[解決済み】ISO C90では、C言語での宣言とコードの混在が禁止されています。
-
[解決済み】ポインタと整数の比較で警告が出る
-
[解決済み】デバッガgdbの使用時に不明な終了シグナルが発生する。
-
[解決済み】警告:組み込み関数'printf'の非互換な暗黙の宣言(デフォルトで有効]
-
[解決済み】サイズ8の無効な読み取り - Valgrind + C
-
[解決済み】C言語で多重定義を防ぐには?
-
[解決済み】宣言指定子で2つ以上のデータ型がある場合のエラー【非公開
-
[解決済み】Makefile:1: ***セパレータがありません。停止します。
-
[解決済み】シンプルなC言語のscanfが機能しない?重複