3

次のchardevが定義されています:

.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

デバイスの不適切な ioctl

同様の質問を見たことがあります:つまり

Linux カーネル モジュール - IOCTL を使用すると ENOTTY が返される

Linux カーネル モジュール/IOCTL: デバイスの不適切な ioctl

しかし、彼らの解決策は私にはうまくいきませんでした

4

1 に答える 1