亚欧色一区w666天堂,色情一区二区三区免费看,少妇特黄A片一区二区三区,亚洲人成网站999久久久综合,国产av熟女一区二区三区

  • 發布文章
  • 消息中心
點贊
收藏
評論
分享
原創

使用GVolumeMonitor監控u盤插拔

2023-04-26 09:44:49
79
0
  • 背景
使用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
0條評論
作者已關閉評論
張****龍
18文章數
0粉絲數
張****龍
18 文章 | 0 粉絲
張****龍
18文章數
0粉絲數
張****龍
18 文章 | 0 粉絲
原創

使用GVolumeMonitor監控u盤插拔

2023-04-26 09:44:49
79
0
  • 背景
使用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
文章來自個人專欄
文章 | 訂閱
0條評論
作者已關閉評論
作者已關閉評論
0
0