3

libhal を使用してデバイス イベントを検出しています。追加または削除されたデバイスを検出できますが、デバイスのマウント ポイントを検出できません。機能libhal_volume_get_mount_point(volume)しません。

デバイスの追加を検出するコールバック関数があります。

static void handle_device_added(LibHalContext *ctx, const char *udi) {

    dbus_bool_t is_storage;
    dbus_bool_t is_volume;

    is_storage = libhal_device_query_capability(ctx, udi, "storage", NULL);
    is_volume = libhal_device_query_capability(ctx, udi, "volume", NULL);

    if (is_storage) {
        drive = libhal_drive_from_udi(ctx, udi);

        if (libhal_drive_is_hotpluggable(drive) || libhal_drive_uses_removable_media(drive)) {
            printf("Storage device added %s model %s\n",
                    libhal_drive_get_device_file(drive),
                    libhal_drive_get_model(drive));
        }

        libhal_drive_free(drive);
    }

    if(is_volume) {
        volume = libhal_volume_from_udi(ctx, udi);
        printf("Mount point = %s\n", libhal_volume_get_mount_point(volume));
        libhal_volume_free(volume);
    }
}

libhal_volume_from_udi は NULL を返します。

Cでストレージデバイスのマウントポイントを検出する適切な方法を知っていますか?

アップデート

検索でデバイスのマウント ポイントを見つけることができました/etc/mtabが、まだ小さな問題が 1 つあります。デバイスには 1 つのパーティションしかないと仮定しています。

ストレージ デバイスのパーティションのリストを取得するにはどうすればよいですか? したがって、それぞれのマウントポイントを見つけることができます。

4

1 に答える 1

2

まず、libhal 関数を使用しようとしたときに何が失敗したかについて詳細を提供すると、その問題を解決するのに役立つ回答が得られる場合があります。しかし、あなたの質問に直接答えるために、C プログラムは /etc/mtab. 形式は一目瞭然で、各行には通常、ストレージ デバイスの名前、マウントされているディレクトリ、ファイル システムの種類、およびマウント オプションが一覧表示されます。

ファイルシステム内の特定のディレクトリを、そのディレクトリが属するマウント ポイントにマップするのは少し難しい場合があります。/etc/mtab をループしている場合は、マウント ポイントがその下に他のマウント ポイントを持つことができることを思い出してください。

「df」のように、これを正しく行うプログラムのソースを見るとわかるかもしれません。または、プログラムがこの情報を頻繁に検索する必要がない場合は、単純に popen(3) を呼び出すことにするかもしれません。 df コマンドでそれを行います。たとえば、次のコマンドdf /media/my-volume/some/pathを実行すると、ストレージ デバイスの名前と、そのデバイスがマウントされているマウント ポイントの両方が表示されます。

于 2011-12-26T18:35:09.330 に答える