0

Raspbian を使用して、Ubuntu システムで以前に実行されていたアプリケーションを Raspberry Pi に移植しようとしています。アプリケーションは、新しい USB フラッシュ ドライブを検出する必要があります。udev の監視は次のように行われます。

/* Create the udev object */
udev = udev_new();
if (!udev) {
    wprinterr("Can't create udev\n");
    exit(EXIT_FAILURE);
}
mon = udev_monitor_new_from_netlink(udev, "udev");
if(mon==NULL) {
    wprinterr("Could not create udev monitor!\n");
    exit(EXIT_FAILURE);
}
if(udev_monitor_filter_add_match_subsystem_devtype(mon, "block", NULL) != 0) {
    wprinterr("Could not add subsystem match to udev monitor\n");
    exit(EXIT_FAILURE);
}
if(udev_monitor_enable_receiving(mon) != 0) {
    wprinterr("Could not enable udev monitor receiving\n");
    exit(EXIT_FAILURE);
}
while (1) {
/*
* this will block until there is a monitor event
*/
    dev = udev_monitor_receive_device(mon);
    if (dev) {

これは、Ubuntu マシンで正常に動作します。しかし、Raspberry Pi では udev_monitor_receive_device(mon) はすぐに NULL ポインターを返します。ドキュメント ( Docu ) によると、これはエラー状態の場合に発生します。Errno は 11 (リソースが一時的に使用不可) に設定されます。しかし、何が問題なのかわかりません。udevデーモンはところで実行されています。誰かアイデアはありますか?

少し前にRaspberryフォーラムで同様の質問を書きましたが、答えが得られず、自分で解決策を見つけることができませんでした. というわけで、ここに再度投稿しました。Raspberry フォーラムの投稿へのリンク

4

1 に答える 1

0

解決策は見つかりませんでしたが、回避策を見つけました。Select を使用して、監視イベントが発生するまでブロックできます。この後、udev_monitor_receie_device(mon) はデバイスへのプローバー ポインターを返します。

私はこのようにすることができます:

    mon = udev_monitor_new_from_netlink(udev, "udev");
    if(mon==NULL) {
        wprinterr("Could not create udev monitor!\n");
        exit(EXIT_FAILURE);
    }
    if(udev_monitor_filter_add_match_subsystem_devtype(mon, "block", NULL) != 0) {
        wprinterr("Could not add subsystem match to udev monitor\n");
        exit(EXIT_FAILURE);
    }
    if(udev_monitor_enable_receiving(mon) != 0) {
        wprinterr("Could not enable udev monitor receiving\n");
        exit(EXIT_FAILURE);
    }    
    fd = udev_monitor_get_fd(mon);
    while (1) {
        /*
         * this will block until there is a monitor event
         */
        fd_set fds;
        int ret;
        FD_ZERO(&fds);
        FD_SET(fd, &fds);
        ret = select(fd+1, &fds, NULL, NULL, NULL);

        /* Check if our file descriptor has received data. */
        if (ret > 0 && FD_ISSET(fd, &fds)) {
            dev = udev_monitor_receive_device(mon);
            if (dev) {
于 2013-04-08T10:10:26.560 に答える