1

ちょっとした背景として、私は Linux Mint (32 ビット) で生データ ストリームを使用しています。これは、データ ストリーム ファイルから 24 ビットの塊を読み取る私のライブラリruby​​-buzzからのものです。

Linux Mint、32ビットでラップトップを再インストールしたところ、突然エラーが表示されましErrno::EINVAL: Invalid argument @ io_freadた.

ajfaraday@squishy ~ $ sudo chmod 777 /dev/input/by-id/*
ajfaraday@squishy ~ $ irb
2.2.1 :001 > path = '/dev/input/by-id/usb-Logitech_Logitech_Buzz_tm__Controller_V1-event-if00'
 => "/dev/input/by-id/usb-Logitech_Logitech_Buzz_tm__Controller_V1-event-if00" 
2.2.1 :002 > f = File.open(path)
 => #<File:/dev/input/by-id/usb-Logitech_Logitech_Buzz_tm__Controller_V1-event-if00> 
2.2.1 :003 > f.read(24)
Errno::EINVAL: Invalid argument @ io_fread - /dev/input/by-id/usb-Logitech_Logitech_Buzz_tm__Controller_V1-event-if00
    from (irb):3:in `read'
    from (irb):3
    from /home/ajfaraday/.rvm/rubies/ruby-2.2.1/bin/irb:11:in `<main>'
2.2.1 :004 > f.read(32)
 => "\xAB>xW\x0E\xDC\x00\x00\x01\x00\xC0\x02\x01\x00\x00\x00\xAB>xW\x0E\xDC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" 

同じシステムで、同じ入力デバイスを使用すると、/dev/input ファイルが作成されましたが、データ ストリームが含まれていませんでした。

tail -f以前は端末から生データ ストリームを監視するのに問題なく使用できた理由とfile.read(24)、ルビーからその 24 ビット チャンクを取得するために使用できた理由がわかりません。Mintのインストールを含む。でも今はどちらもできません。

4

1 に答える 1

0

私が見つけた解決策を完全には理解していませんが、おそらく同じ問題に直面しているすべての人に役立つでしょう。

Linux Mint の 32 ビット アーキテクチャの結果として、file.readメソッドが 2 の累乗ではない引数 (8、16、32 など) を使用できないようになっているようです。これがなぜなのかわかりません。

ただし、Mint の 64 ビット バージョンを使用して再インストールすると、以前に KDE インストールで見たのと同じように機能します (振り返ってみると、おそらく 64 ビット アーキテクチャでした)。

于 2016-07-03T17:18:37.343 に答える