11

私は最近、仕事でいくつかのコードを継承しました。これは古い 2.4.X Linux カーネル ドライバーであり、新しいカーネル 2.6 以降でそれらを動作させることを任されました。3.1.10 カーネルを搭載した OpenSUSE 12.1 で実行しています。

元のコードを register_chrdev() から class_create()/device_create() 呼び出しを使用するように更新したところ、デバイスが /dev に正しく表示されることがわかりました。現在の問題は、デバイスのアクセス許可がユーザーに対してのみ r/w に設定されていることです。

crw-------  1 root root    244,   0 Aug  7 07:57 gcanain

コマンドラインからファイルを「chmod」できること、またはudevパーミッションを設定できることは知っています...しかし、insmodコマンドを発行すると、devが正しい方法でマウントされるように、プログラムでこれを行う方法はありますかルールはすでに制定されていますか?

これを行うために呼び出すことができる API が存在する可能性はありますか?これらの作成 API のいずれかに欠けているオプションはありますか?

明確にするために、udev ルールを使用したくない理由の 1 つは、事前にデバイス ドライバーの名前がわからないことです。デバイス ドライバーはループ内で生成されるため、名前に数字が追加されます。nNumDevs はほとんど何でもかまいません。

for (i = 0; i < nNumDevs; i++) {
  strcpy(Modname,GC_ANAIN_MODULE_NAME);
  strcat(Modname,"%d");
  device_create(c1, NULL, MKDEV(nMajor, GC_ANAIN_MINOR_VERSION+i), NULL, Modname, i);
}
4

3 に答える 3

13

これは、TTY ドライバーが作成時に許可を 0666 に設定するために使用する方法です。

static char *tty_devnode(struct device *dev, umode_t *mode)
{
        if (!mode)
                return NULL;
        if (dev->devt == MKDEV(TTYAUX_MAJOR, 0) ||
            dev->devt == MKDEV(TTYAUX_MAJOR, 2))
                *mode = 0666;
        return NULL;
}

static int __init tty_class_init(void)
{
        tty_class = class_create(THIS_MODULE, "tty");
        if (IS_ERR(tty_class))
                return PTR_ERR(tty_class);
        tty_class->devnode = tty_devnode;
        return 0;
}

の devnode 属性には、アクセス許可を設定できるstruct classパラメーター ポインターがあります。mode

デバイスが破壊さmodeれる可能性があるので注意してください。NULL

于 2016-03-02T15:03:03.033 に答える
4

これを試して: #include <sys/stat.h>

int chmod(const char *path, mode_t mode); また int fchmod(int fd, mode_t mode);

ソース: man -s 2 chmod

于 2012-08-07T14:15:11.733 に答える