2017-02-14 19 views
0

取得私は定義された以下のchardevあります.CLinuxカーネルモジュールのioctlの上ENOTTY

static long device_ioctl(
        struct file* file, 
        unsigned int ioctl_num, 
        unsigned long ioctl_param) 
{ 
    ... 
} 

static int device_open(struct inode* inode, struct file* file) 
{ 
    ... 
} 

static int device_release(struct inode* inode, struct file* file) 
{ 
    ... 
} 

struct file_operations Fops = { 
    .open=device_open, 
    .unlocked_ioctl= device_ioctl, 
    .release=device_release 
}; 

static int __init my_dev_init(void) 
{ 
    register_chrdev(MAJOR_NUM, "MY_DEV", &Fops); 
    ... 
} 
module_init(my_dev_init); 

私のユーザーコード

ioctl(fd, IOCTL_MY_DEV1, 1); 

の.h

#define MAJOR_NUM 245 
#define MINOR_NUM 0 
#define IOCTL_MY_DEV1 _IOW(MAJOR_NUM, 0, unsigned long) 
#define IOCTL_MY_DEV2 _IOW(MAJOR_NUM, 1, unsigned long) 
#define IOCTL_MY_DEV3 _IOW(MAJOR_NUM, 2, unsigned long) 

モジュールを

同じエラーで常に失敗する:ENOTTY

Inappropriate ioctl for device

私が見てきた同様の質問: すなわち

Linux kernel module - IOCTL usage returns ENOTTY

Linux Kernel Module/IOCTL: inappropriate ioctl for device

しかし、私は

+0

'device_ioctl()'が呼び出されたかどうか確認しましたか? (printkコールをそこに入れてください) – nos

+0

@nos私の 'device_ioctl()'は呼び出されません、 'printk'だけの空のボディを入れてください – Mugen

+0

あなたはioctl呼び出しのバージョンをうまく登録していません。 –

答えて

1

ENOTTYカーネルによって発行されるため、自社のソリューションが動作しませんでしたあなたのデバイスドライバが呼び出されるioctl関数を登録していないとき。あなたの機能が登録されていないのは恐らくstruct file_operations構造の.unlocked_ioctlフィールドに登録されているためです。

おそらく、ロックされたバージョンの関数に登録すれば別の結果になるでしょう。最も可能性の高い原因は、ioctl呼び出しのためにiノードがロックされていることです(同じデバイスへの操作readまたはwriteの操作を避けるため)。

申し訳ありませんが、私はLinuxソースツリーフィールドの適切な名前を使用するが、確かにあなた自身でそれを見つけることができるでしょう。

関連する問題