zoukankan      html  css  js  c++  java
  • Linked Lists in the Linux Kernel

    Hareesh Nagarajan (hnagaraj AT cs uic edu)
    Sat Nov 5 22:47:56 CST 2005

    For a good introduction to the implementation of linked lists API inside the Linux Kernel check this link.

    If you are weary of programming with linked lists inside the Linux kernel, download the list.h file which has been stripped away of kernel specific stuff from this link. Then, all you have to do is, add this file into your userspace code with a:

    #include "list.h"

    and you are all set.

    You can also download the following simple example (which appears below) from this link. The compile flags are the usual:

    gcc link-list-test.c -olink-list-test

    Note: In your kernel code use list_for_each instead of __list_for_each

    The Example

    #include <stdio.h>
    #include <assert.h>
    #include <cstdlib.h>
    
    #include "list.h"
    
    struct foo {
    	int info;
    	struct list_head list_member;
    };
    
    void add_node(int arg, struct list_head *head)
    {
        struct foo *fooPtr = (struct foo *)malloc(sizeof(struct foo));
        assert(fooPtr != NULL);
        
        fooPtr->info = arg;
        INIT_LIST_HEAD(&fooPtr->list_member);
        list_add(&fooPtr->list_member, head);
    }
    
    void display(struct list_head *head)
    {
        struct list_head *iter;
        struct foo *objPtr;
    
        __list_for_each(iter, head) {
            objPtr = list_entry(iter, struct foo, list_member);
            printf("%d ", objPtr->info);
        }
        printf("
    ");
    }
    
    void delete_all(struct list_head *head)
    {
        struct list_head *iter;
        struct foo *objPtr;
        
      redo:
        __list_for_each(iter, head) {
            objPtr = list_entry(iter, struct foo, list_member);
            list_del(&objPtr->list_member);
            free(objPtr);
            goto redo;
        }
    }
    
    int find_first_and_delete(int arg, struct list_head *head)
    {
        struct list_head *iter;
        struct foo *objPtr;
    
        __list_for_each(iter, head) {
            objPtr = list_entry(iter, struct foo, list_member);
            if(objPtr->info == arg) {
                list_del(&objPtr->list_member);
                free(objPtr);
                return 1;
            }
        }
    
        return 0;
    }
    
    main() 
    {
        LIST_HEAD(fooHead);
        
        add_node(10, &fooHead);
        add_node(20, &fooHead);
        add_node(25, &fooHead);
        add_node(30, &fooHead);
        
        display(&fooHead);
        find_first_and_delete(20, &fooHead);
        display(&fooHead);
        delete_all(&fooHead);
        display(&fooHead);
    }
    

    copyright
    https://www.cs.uic.edu/~hnagaraj/articles/linked-list/

    ListExample
    http://www1.cs.columbia.edu/~aya/W3101-01/lectures/linked-list.pdf

    Kernel Linux List - An Efficient Generic Linked List
    http://www.davidespataro.it/kernel-linux-list-efficient-generic-linked-list/

    Doubly linked list
    https://0xax.gitbooks.io/linux-insides/content/DataStructures/linux-datastructures-1.html


  • 相关阅读:
    财务报表分析(张新民教授)-第六章 企业报表战略分析
    zend studio 10破解/汉化
    使用jQuery动态加载js脚本文件的方法
    手机端的META你有多了解?
    js添加事件、移除事件、阻止冒泡、阻止浏览器默认行为等写法(兼容IE/FF/CHROME)
    理解CSS Clip属性及用法
    js touch触屏原理分析
    解决xp共享的批处理文件
    jQuery Tools:Web开发必备的 jQuery UI 库
    使用CSS3线性渐变实现图片闪光划过效果
  • 原文地址:https://www.cnblogs.com/dong1/p/14976922.html
Copyright © 2011-2022 走看看