2017-02-14 528 views
0

我有以下chardev定義:入門上的ioctl ENOTTY針對Linux內核模塊

.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) 

模塊的.c

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); 

始終以相同錯誤失敗: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字段中註冊了它。

如果將其註冊到函數的鎖定版本中,可能會得到不同的結果。最可能的原因是,該inode被鎖定爲ioctl調用(因爲它應該是,以避免同時readwrite業務競爭條件相同的設備)

對不起,我得給Linux源代碼樹進不去爲使用的字段的正確名稱,但肯定你可以自己找到它。