0

libudevで特定の問題に直面しています。USB経由で接続されたデバイスを常にリッスンし続けるリスナースレッドを作成しました。継続的なwhileループの開始時にlibudevAPIudev_monitor_receive_deviceを使用しました。これは、ブロッキング呼び出しであるためです。ソースはlibudevv1.6.3で正常に動作しますが、v1.7.2にアップグレードすると、udev_monitor_receive_deviceの呼び出しがブロックされなくなり、whileループが継続的に実行され、APIがNULLを返し続けます。以下は、私のコードでのlibudevの使用法を理解するのに役立つコードの一部です。

struct udev *udevObject ;
struct udev_device *mDev;
struct udev_enumerate *enumerate;
struct udev_monitor *mUdevMonitorObject;

udevObject = udev_new();
if(NULL == udevObject){
    LOGERR((TEXT("Listener thread :: Error initialising Udev Library\r\n")));
    return false;
}
mUdevMonitorObject = udev_monitor_new_from_netlink(udevObject, "udev");
udev_monitor_enable_receiving(mUdevMonitorObject);
//    enumerate = udev_enumerate_new(udevObject);
//    udev_enumerate_scan_devices(enumerate);


while(1)
{
    // This loop keeps running continuously on libudev v1.7.3, but the call blocks for v1.6.3
    mDev = udev_monitor_receive_device(mUdevMonitorObject);
    LOGINFO((TEXT("Listener thread:: Processing UDEV trigger\r\n")));
}

この問題は長い間私を悩ませてきました。どんな助けでもいただければ幸いです。

4

2 に答える 2

1

ええ、私は同じことを見ます。最近のudev_monitor_receive_deviceと対話する唯一の方法はselect/pollを使用することのようです-私はあなたと同様のループを持っており、udev_monitor_recieve_deviceの前にこれらの行を追加するとすべてが賢明に動作します:

int fd = udev_monitor_get_fd(mUdevMonitorObject);
fd_set fdset;
FD_ZERO(&fdset);
FD_SET(fd, &fdset);
if(select(fd+1, &fdset, NULL, NULL, NULL) < 0) {
    /* error in select */
    continue;
}

このダンスを行わせるのではなく、データの準備が整うまでreceive_deviceがブロックされていればいいのですが、そこに行きます。

于 2012-06-25T13:05:50.580 に答える
0

APIリファレンスを参照してください:

モニターソケットはデフォルトでNONBLOCKに設定されています。udev_monitor_get_fd()によって返されるファイル記述子のpoll()のバリアントを使用して、新しいデバイスが到着したときにウェイクアップするか、ファイル記述子をブロッキングモードに切り替える必要があります。

于 2014-01-08T19:27:55.857 に答える