- 背景
使用netlink可以監控u盤相關的熱插拔事件,通過查詢glib相關手冊發現gio中也有類似相關功能,下面看看如何使用gio來監控U盤事件。
## Gio/VolumeMonitor 簡介
Gio 是一個提供I/O、網絡、進程間通訊的應用級別的庫。
在2.0版本中的編譯依賴如下:
頭文件:
    gio/gdesktopappinfo.h, gio/gfiledescriptorbased.h, gio/gio.h, gio/gunixfdmessage.h, gio/gunixinputstream.h, gio/gunixmounts.h, gio/gunixoutputstream.h
pkg-config 文件:
    gio-2.0, gio-unix-2.0
VolumeMonitor類:
class Gio.VolumeMonitor : GObject.Object
{
  /* No available fields */
}GVolumeMonitor可以列出用戶感興趣的Volume和設備。GVolumeMonitor不能在沒有線程默認上下文活動的情況下從主線程以外的其他線程使用。
為了接收有關通過GVFS監控的卷和裝載的更新,必須運行一個主循環來監聽這些事件。
- 函數簡介
g_volume_monitor_get
獲取volume監視器
g_volume_monitor_get_connected_drives
獲取連接系統的驅動器的列表
g_volume_monitor_get_mount_for_uuid
通過uuid查找GMount對象
g_volume_monitor_get_mounts
獲取mounts信息
g_volume_monitor_get_volume_for_uuid
通過uuid查找GVolume對象
g_volume_monitor_get_volumes
獲取系統的volume
- 事件簡介信號
Gio.VolumeMonitor::mount-added
執行掛載盤后會產生
Gio.VolumeMonitor::mount-changed
mount事件
Gio.VolumeMonitor::mount-pre-unmount
拔出或者unmount
Gio.VolumeMonitor::mount-removed
磁盤被移除
- Demo
#include <glib.h>
#include <gio/gio.h>
//gcc volume.c -o volume -I /usr/lib/aarch64-linux-gnu/glib-2.0/include/ -I /usr/include/glib-2.0 -lglib-2.0 -lgobject-2.0  -lgio-2.0
static void handle_mount_changed(GVolumeMonitor* monitor, GMount* mount, gpointer data)
{
    char* ev = (char*)data;
    GFile* root = g_mount_get_root(mount);
    gchar* path = g_file_get_path(root);  
    if (g_strcmp0(ev, "mount-removed") == 0) {
        g_print("removed path =%s\n", path);
    } else if(g_strcmp0(ev, "mount-added") == 0) {
        g_print("mount path =%s\n", path);
    }  
    g_object_unref(G_OBJECT(root));
    g_free(path);
}
int main()
{
    GVolumeMonitor* monitor = g_volume_monitor_get();  
    g_signal_connect(G_OBJECT(monitor), "mount-added",
                     G_CALLBACK(handle_mount_changed), "mount-added");
    g_signal_connect(G_OBJECT(monitor), "mount-removed",
                     G_CALLBACK(handle_mount_changed), "mount-removed");
    g_main_loop_run(g_main_loop_new(0,0));
    return 0;
}- 編譯
gcc volume.c -o volume -I /usr/lib/aarch64-linux-gnu/glib-2.0/include/ -I /usr/include/glib-2.0 -lglib-2.0 -lgobject-2.0  -lgio-2.0- 運行
./volume插拔U盤即可以看到log信息。
- 參考資料
//gitlab.gnome.org/GNOME/glib/
//docs.gtk.org/gio/index.html