4

私は、Pythonフロントエンドを使用して、Linux上で仮想ジョイスティックを作成する小さなプログラムを開発しています。Linux-Virtual-Joystickのフォークです。

ユーザー定義のジョイスティックを作成するには、dev/uinputに書き込む必要があります。ファイルはO_RDWRで開かれます(デバッグ中にファイルの他の読み取り/書き込みアクセスを一時的に追加しました)。私がする時

write(uifd, &uidev, sizeof(uinput_user_dev));

-1を返し、errnoを22(EINVAL)に設定します。引数は正しく、ファイルは正常に開かれました。

他の誰かがこの問題に遭遇しましたか?プロジェクトを約1か月間棚上げしましたが、Ubuntuの最後のバージョンで機能したことを覚えています。

更新: uinputはubuntu12.10で動作します

4

3 に答える 3

8

あなたが抱えている問題は、へのアクセス権にあると思いますuinput。あなたが受け取るエラーメッセージはその典型であり、私は他のデバイスで以前に同じ振る舞いを見ました。

その仮定をテストするには、/dev/uinputすべてのアクセスを許可する権限を変更します。

chmod +0666 /dev/uinput

次に、コードを再試行してください。これで正常に機能する場合は、その変更を永続的にする必要があります。そうしないと、再起動後に元のアクセス許可に戻ります。

これを安全に行うには、次の場所にあるルールファイルを追加します。/etc/dev/rules.d

次の行で:

KERNEL=="uinput", GROUP="udev_group"

ルールファイルがどのように表示されるかを確認するには、次の場所にあるudevルールファイルを確認してください。

/lib/udev/rules.d/50-udev-default.rules

準備ができたら、udev_groupという名前のグループを追加し、それにユーザー名を追加します(またはへの書き込みアクセス権を持つことになっているすべてのユーザーuinput)。

新しいルールを機能させるには、再起動が必要になる場合があります。

その結果、そのグループのメンバーであるすべてのユーザーがに完全にアクセスできるようuinputになります。これはまさにあなたが望んでいたことです。


グループを追加するには、「ユーザーとグループ」をインストールできます。

sudo apt-get install gnome-system-tools

次の場所で起動します。

Application -> System Tools -> Administration -> Users and Groups**

またはターミナルで:

gnome-system-tools
于 2012-08-13T18:52:17.460 に答える
0

uinputモジュールがないため、先に進む前にビルドを検討する必要があります。

私はこの方法でLinuxカーネルモジュールを再構築したことがないので、ここで説明に従うことができます

まず、対応するLinuxソースコードとヘッダーを取得する必要があります。また、 module-init-toolsをインストールします
。次に、dirを/ usr / src / linuxに変更し、rootとして実行します。

cp /boot/config-* ./.config
make drivers/input/misc/uinput.ko

uinput.koのビルドには数分かかります

uinput.koを/lib/ modules / <"yourkernelversion"> / kernel / drivers / input / miscに移動する前に、動作するかどうかを確認してください

insmod ./drivers/input/misc/uinput.ko

編集1:

Linux 2.6.35-17.23以降、uinputは組み込みモジュールのようです。そのため、lsmodでは表示されません

私はあなたのコードを見たところです、そして私は問題がこの行にあると思います

if (write(uifd, &uidev, sizeof(uinput_user_dev) != sizeof(uinput_user_dev))) 

そのはず

if (write(uifd, &uidev, sizeof(uinput_user_dev)) != sizeof(uinput_user_dev))

お役に立てば幸い

于 2012-08-13T23:24:19.187 に答える
0

Ubuntu 14.04でも、リポジトリ(https://github.com/ferry-/Linux-Virtual-Joystick-cpp)からこのエラーが発生しました。device.hのデバイスコンストラクターでdevice::uidevメンバーをゼロにすることで修正しました。

memset(&uidev、0、sizeof(uidev));

于 2014-07-23T23:18:50.443 に答える