以降

2011-12-07 15 views
0

私はlibudevと、特定の問題に直面しています奇妙な行動v1.7.2をlibudev。私は、USB経由で接続されたデバイスを絶えず聴いているリスナースレッドを書いています。それはブロッキング・コールであるように私は連続whileループの開始時にlibudevのAPIのudev_monitor_receive_deviceを使用していました。ソースはlibudevのV1.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"))); 
} 

です。どんな助けもありがとう。

+0

APIまたはその動作が変更されていないようにドキュメントを確認しましたか?それ以外の場合はバグかもしれませんので、libudevの開発者に指示してください。そうではありません。 –

答えて

1

うん、私は同じことを参照してください。

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がまだブロックされた場合、それはいいだろう:私はあなたに似たループを持っている、とudev_monitor_recieve_deviceすべてが賢明な行動ます前に、これらの行を追加 - udev_monitor_receive_deviceこれらの日と対話するための唯一の方法は、選択/世論調査であると思われますあなたがこのダンスをするのではなく、データが準備されるまで、しかしそこにあなたは行き​​ます。

0

API referenceを参照してください:

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