linux内核中uevent_hleper的作用
时间: 2024-06-03 18:10:35 浏览: 20
uevent_helper是Linux内核中的一个用户空间工具,可以用于控制和处理来自设备驱动程序的事件通知。它负责接收硬件设备插入和拔出的事件,并在Kernel事件通知系统中生成相应的事件,以便设备管理器可以处理这些事件并动态地加载或卸载相关的内核模块和驱动程序。同时,uevent_helper还可以执行其他用户空间脚本和应用程序,以便在设备状态发生变化时进行自定义操作。
相关问题
uevent_listener命令
uevent_listener命令是用于监听Linux系统中的事件的命令。它可以通过监控/dev目录下的uevent文件来获取系统事件的通知。当系统中发生设备插拔、驱动加载或卸载等事件时,uevent_listener会接收到相应的通知并执行相应的操作。
可以使用以下命令启动uevent_listener:
```
uevent_listener
```
该命令会在后台运行,并监听uevent文件。当有事件发生时,它会打印相关信息到标准输出或指定的日志文件中。
需要注意的是,uevent_listener命令在大多数Linux发行版中并不默认安装。你可能需要手动安装或执行其他操作以获取该命令。
g_uevent_device_new 代码举例
以下是一个简单的 g_uevent_device_new 函数实现的示例代码:
```c
#include <glib.h>
#include <gio/gio.h>
#define UEVENT_BUFFER_SIZE 2048
typedef struct _GUeventDevice GUeventDevice;
struct _GUeventDevice {
GObject parent_instance;
gchar *syspath;
gchar *subsystem;
gchar *devtype;
gchar **filters;
GRegex **regex_filters;
guint n_filters;
GIOChannel *io_channel;
guint io_watch_id;
gchar io_buffer[UEVENT_BUFFER_SIZE];
};
G_DEFINE_TYPE(GUeventDevice, g_uevent_device, G_TYPE_OBJECT);
static gboolean
g_uevent_device_io_watch_callback(GIOChannel *channel, GIOCondition condition,
gpointer user_data)
{
GUeventDevice *self = G_UEVENT_DEVICE(user_data);
if (condition & G_IO_IN) {
gsize bytes_read = 0;
gsize io_buffer_size = sizeof(self->io_buffer) - 1;
if (g_io_channel_read_chars(channel, self->io_buffer, io_buffer_size,
&bytes_read, NULL) != G_IO_ERROR_NONE) {
g_warning("Failed to read from uevent device");
return G_SOURCE_REMOVE;
}
/* Null-terminate the read buffer */
self->io_buffer[bytes_read] = '\0';
/* Process the uevent messages in the buffer */
gchar *line_start = self->io_buffer;
gchar *line_end = NULL;
while ((line_end = strchr(line_start, '\n'))) {
*line_end = '\0';
gchar **kv_pairs = g_strsplit(line_start, "=", -1);
/* Process the key-value pairs in the uevent message */
for (guint i = 0; kv_pairs[i]; i += 2) {
gchar *key = kv_pairs[i];
gchar *value = kv_pairs[i + 1];
/* Filter out the key-value pairs that don't match any of the
regex filters */
gboolean filter_match = FALSE;
for (guint j = 0; j < self->n_filters; j++) {
if (g_regex_match(self->regex_filters[j], key, 0, NULL)) {
filter_match = TRUE;
break;
}
}
if (!filter_match) {
continue;
}
g_message("Received uevent message: %s=%s", key, value);
}
g_strfreev(kv_pairs);
line_start = line_end + 1;
}
}
return G_SOURCE_CONTINUE;
}
static void
g_uevent_device_init(GUeventDevice *self)
{
self->syspath = NULL;
self->subsystem = NULL;
self->devtype = NULL;
self->filters = NULL;
self->regex_filters = NULL;
self->n_filters = 0;
self->io_channel = NULL;
self->io_watch_id = 0;
}
static void
g_uevent_device_class_init(GUeventDeviceClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS(klass);
object_class->finalize = (GObjectFinalizeFunc) g_free;
}
GUeventDevice *
g_uevent_device_new(const gchar *syspath, const gchar *subsystem,
const gchar *devtype, gchar **filters)
{
GUeventDevice *self = g_object_new(G_TYPE_UEVENT_DEVICE, NULL);
self->syspath = g_strdup(syspath);
self->subsystem = g_strdup(subsystem);
self->devtype = g_strdup(devtype);
self->filters = g_strdupv(filters);
/* Compile the regex filters */
for (guint i = 0; self->filters[i]; i++) {
GRegex *regex_filter = g_regex_new(self->filters[i], 0, 0, NULL);
if (!regex_filter) {
g_warning("Failed to compile regex filter: %s", self->filters[i]);
continue;
}
self->regex_filters = g_realloc(self->regex_filters,
(self->n_filters + 1) * sizeof(GRegex *));
self->regex_filters[self->n_filters++] = regex_filter;
}
/* Open the uevent device file */
gchar *uevent_path = g_build_filename(self->syspath, "uevent", NULL);
GError *error = NULL;
self->io_channel = g_io_channel_new_file(uevent_path, "r", &error);
if (!self->io_channel) {
g_warning("Failed to open uevent device: %s", error->message);
g_error_free(error);
g_object_unref(self);
return NULL;
}
/* Add a watch for the IO channel */
self->io_watch_id = g_io_add_watch(self->io_channel, G_IO_IN,
g_uevent_device_io_watch_callback, self);
g_free(uevent_path);
return self;
}
```
这个示例代码演示了如何使用 GLib 和 GIO 库来创建一个 GUeventDevice 对象,该对象可以通过监听 Linux 内核的 uevent 消息来获取设备事件。GUeventDevice 对象可以指定一些过滤器,以只接收特定的 uevent 消息。在对象的销毁期间,将释放所有内存和资源。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)