linux使用哈希链表的代码示例
时间: 2023-07-25 12:33:56 浏览: 63
以下是一个使用哈希链表实现的简单的 Linux 内核模块示例:
```c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/hashtable.h>
MODULE_LICENSE("GPL");
// 定义哈希表
DEFINE_HASHTABLE(my_hash, 10);
struct my_data {
int key;
char *value;
struct hlist_node node;
};
int my_hash_table_init(void)
{
// 向哈希表中添加数据
struct my_data *data1 = kmalloc(sizeof(*data1), GFP_KERNEL);
data1->key = 1;
data1->value = "value1";
hash_add(my_hash, &data1->node, data1->key);
struct my_data *data2 = kmalloc(sizeof(*data2), GFP_KERNEL);
data2->key = 2;
data2->value = "value2";
hash_add(my_hash, &data2->node, data2->key);
// 遍历哈希表
struct my_data *entry;
hash_for_each(my_hash, i, entry, node) {
printk(KERN_INFO "key:%d, value:%s\n", entry->key, entry->value);
}
return 0;
}
void my_hash_table_exit(void)
{
// 从哈希表中删除数据
struct my_data *entry;
hash_for_each(my_hash, i, entry, node) {
hash_del(&entry->node);
kfree(entry);
}
}
module_init(my_hash_table_init);
module_exit(my_hash_table_exit);
```
在这个示例中,我们首先使用 `DEFINE_HASHTABLE` 宏定义了一个名为 `my_hash` 的哈希表,它具有 10 个槽位。
然后,我们定义了一个名为 `my_data` 的结构体,它包含一个键值对,以及一个 `hlist_node` 类型的节点,用于链接到哈希链表中。
接下来,在 `my_hash_table_init` 函数中,我们向哈希表中添加了两个数据,通过 `kmalloc` 函数分配空间并将数据结构体插入到哈希表中,使用 `hash_add` 函数将其添加到哈希表中。
最后,我们使用 `hash_for_each` 函数遍历哈希表并打印每个元素的键值对。
在 `my_hash_table_exit` 函数中,我们使用 `hash_for_each` 函数遍历哈希表并删除每个元素,释放分配的内存空间。
注意,这个示例是一个内核模块示例,需要在 Linux 系统中编译和加载。
相关推荐
![c](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.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)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)