伍佰目录 短网址
  当前位置:海洋目录网 » 站长资讯 » 站长资讯 » 文章详细 订阅RssFeed

Linux内核红黑树使用

来源:本站原创 浏览:50次 时间:2023-06-27

我现正在linux kernel 4.4.1中新增一个类sysfs文件系统,取名jefffs,
大名鼎鼎的kobject,自然也被我山寨成了jobject :)
内核中的小知识点、数据结构什么的当然也非常多,需要在开发项目的时候不断总结运用才能融会贯通,现记录一个昨天用到的红黑树。如果要知道原理上这个网站,直接动态观看: http://47.52.149.59/jeff_struction/visualization/RedBlack.html
现直接贴上红黑树测试代码:

  1/*jefffs.h*/  2  3#ifndef __JEFFFS_INTERNAL_H  4#define __JEFFFS_INTERNAL_H  5  6#include <linux/jefffs.h>  7extern int test_rb(void);  8  9struct jeff_node{ 10    atomic_t count; 11    const char *name; 12    struct rb_node rb; 13    unsigned int ino; 14}; 15#endif 16 17 18/*************************************/ 19/* rb.c*/ 20#include <linux/rbtree.h> 21#include <linux/slab.h> 22#include "jefffs.h" 23 24#define rb_to_jn(X) rb_entry((X),struct jeff_node,rb) 25 26int jeff_rb_insert(struct rb_root *root,struct jeff_node *data) 27{ 28    struct rb_node **node = &(root->rb_node); 29    struct rb_node *parent = NULL; 30 31    while(*node){ 32        struct jeff_node *pos = rb_to_jn(*node); 33 34        parent = *node; 35        if(data->ino < pos->ino) 36            node = &(*node)->rb_left; 37        else if(data->ino > pos->ino) 38            node = &(*node)->rb_right; 39        else  40            return -1; 41    } 42    rb_link_node(&data->rb,parent,node); 43    rb_insert_color(&data->rb,root); 44    return 0; 45} 46 47void jeff_print_rbtree(struct rb_root *tree) 48{ 49    struct rb_node *node; 50 51    for(node = rb_first(tree);node;node = rb_next(node)) 52        printk("%d ",(rb_to_jn(node))->ino); 53 54    printk("%s (%d)\n",__func__,__LINE__); 55} 56 57 58struct jeff_node *jeff_rb_search(struct rb_root *root,int ino) 59{ 60    struct rb_node *node = root->rb_node; 61 62    while(node){ 63        struct jeff_node *pos = rb_to_jn(node); 64 65        if(ino < pos->ino) 66            node = node->rb_left; 67        else if(ino > pos->ino) 68            node = node->rb_right; 69        else 70            return pos; 71    } 72    return NULL; 73} 74 75int  jeff_rb_delete(struct rb_root *root,int ino) 76{ 77    struct jeff_node *pos = jeff_rb_search(root,ino); 78 79    if(!pos){ 80        printk("not found jeff_node,can not delete\n"); 81        return -1; 82    } 83    rb_erase(&pos->rb,root); 84 85    return 0; 86} 87 88 89 90int test_rb(void) 91{ 92 93    struct rb_root root = RB_ROOT; 94    struct jeff_node *search = NULL; 95    int i; 96    int retval; 97    char *error; 98 99#define MAX_TEST_NODE (10)100    struct jeff_node *node[MAX_TEST_NODE];101102    for(i = 0;i < MAX_TEST_NODE;i++){103        node[i] = kmalloc(sizeof(struct jeff_node),GFP_KERNEL); 104        if(!node[i]){105            error = "no enough memory\n";106            goto error;107        }108        node[i]->ino = i;109        if(i == 3)110            node[i]->name = "9527";111        retval = jeff_rb_insert(&root,node[i]);112        if(retval)113            goto err_val;114    }115116    jeff_rb_delete(&root,5);117    jeff_print_rbtree(&root);118    search = jeff_rb_search(&root,3);119    if(!search){120        printk("jeff search fail %s(%d)\n",__func__,__LINE__);121        return -1;122    }123    printk("searched name is %s\n",search->name);124125    return 0;126err_val:127    return -1;128error:129    printk("jeff_node %s %s(%d)\n",error,__func__,__LINE__);130    return -ENOMEM;131}

以上代码主函数是test_rb,由其他函数直接调用执行,运行结果如下:

  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net