4

おもちゃのファイル システム モジュールで ioctl 関数を呼び出そうとしています。この ioctl に、呼び出し元から渡される変数を設定させたいだけです。ここまでで、ioctl 呼び出しを可能にする ioctl インフラストラクチャーをセットアップしました。私のモジュールには、ioctl を処理するためのこの関数があります。

int ospfs_ioctl(struct inode *inode, struct file *filp,
      unsigned int cmd, unsigned long arg)
{
    if(cmd == OSPFSIOCRASH)
    {
        eprintk("crash: %ld\n", arg);
        return 0;
    }
    else
        return -ENOTTY;
}

そして、私のテスト関数は次のようになります。

#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#define OSPFSIOCRASH 42

int main()
{
    int fd = open("/tmp/cs111/lab3-thief/test/hello.txt", O_RDWR);
    printf("ioctl call: %d\n", ioctl(fd, OSPFSIOCRASH, 100));
    close(fd);
}

出力が

crash: 100
ioctl call: 0

しかし、出力は実際には

crash: 0
ioctl call: 0

私は単純な間違ったことをしているに違いない。誰かが助けて、問題が何であるかを指摘してもらえますか? よろしくお願いします。

4

2 に答える 2

0

これはあなたの問題を解決する解決策ではないかもしれませんが、あなたの質問とコメントからの限られた情報に基づいて、これが私が収集できたものです.

質問とコメントに基づいて、次のようにstruct file_operations構造を定義したようです。

struct file_operations fops = { .ioctl=ospfs_ioctl };

あなたの署名はospfs_ioctl、古いioctlを使用していることを示唆しています。

最近のカーネル (少なくとも 2.6.35 以降以降) では、.unlocked_ioctlの代わりに使用することをお勧めします.ioctl

struct file_operations fops = { .unlocked_ioctl=ospfs_ioctl };

関数の定義は次のospfs_ioctlように変更されます。

long ospfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)

unlocked_ioctlと通常の ioctlの違いについては、こちらを参照してください。要するにBKL、ioctl を呼び出す前に恐ろしいことはしません。

また、Chris Doddの提案に従って、 をどのように定義しているかを再確認する必要がありますOSPFIOCRASH。推奨される方法は、_IO(magic, some_num_for_ioctl)

于 2013-03-08T21:23:35.727 に答える
0

Chris Dodd の提案に従って、私はに変更#define OSPFIOCRASH 42#define OSPFSIOCRASH _IO(magic, 0)、それ以来、望ましい動作を得ています。

于 2013-03-08T21:39:40.557 に答える