当前位置:  技术问答>linux和unix

linux 内核相关的链表代码,有地方不懂????

    来源: 互联网  发布时间:2017-05-29

    本文导语:  /********main.c********************/] #include  #include  #include "list.h" #define NAMESIZE 32 struct score {       int id;       char name[NAMESIZE];       int math;       struct list_head node; }; void print_s(void *data) {       struct score ...



/********main.c********************/]
#include 
#include 

#include "list.h"

#define NAMESIZE 32

struct score {
      int id;
      char name[NAMESIZE];
      int math;
      struct list_head node;
};

void print_s(void *data)
{
      struct score *d = data;
      printf("%d %s %dn", d->id, d->name, d->math);
}

int main(void)
{
      struct score *datap;
      int i;
      struct list_head *cur;

      LIST_HEAD(list);

      for (i = 0; i id = i;
    datap->math = 100 - i;
    snprintf(datap->name, NAMESIZE, "stu%d", i);

    list_add(&datap->node, &list);
      }

      __list_for_each(cur, &list) {
    datap = list_entry(cur, struct score, node);
    print_s(datap);
      }

#if 0
      __list_for_each(cur, &list) {
    datap = list_entry(cur, struct score, node);
    if (datap->id == 9) {
  __list_del_entry(&datap->node);
  free(datap);
    }
      }
      printf("n");
      __list_for_each(cur, &list) {
    datap = list_entry(cur, struct score, node);
    print_s(datap);
      }
#endif

      __list_for_each(cur, &list) {
    datap = list_entry(cur, struct score, node);
    if (datap->id == 5) {
  break;
    }
      }
      printf("n");
      if (cur == &list) {
    printf("Can not find.n");
      } else {
    print_s(datap);
      }

      return 0;
}
/********头文件 list.h*****************/
#ifndef HS_KERNEL_LIST_H
#define HS_KERNEL_LIST_H

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

#define container_of(ptr, type, member) 
      (type *)( (char *)ptr - offsetof(type,member) )

struct list_head {
      struct list_head *next, *prev;
};

#define LIST_HEAD_INIT(name) { &(name), &(name) }

#define LIST_HEAD(name) 
struct list_head name = LIST_HEAD_INIT(name)

static inline void INIT_LIST_HEAD(struct list_head *list)
{
list->next = list;
list->prev = list;
}

static inline void __list_add(struct list_head *new,
      struct list_head *prev,
      struct list_head *next)
{
next->prev = new;
new->next = next;
new->prev = prev;
prev->next = new;
}

static inline void list_add(struct list_head *new, struct list_head *head)
{
__list_add(new, head, head->next);
}

static inline void __list_del(struct list_head * prev, struct list_head * next)
{
next->prev = prev;
prev->next = next;
}

static inline void __list_del_entry(struct list_head *entry)
{
__list_del(entry->prev, entry->next);
}

static inline void list_del_init(struct list_head *entry)
{
__list_del_entry(entry);
INIT_LIST_HEAD(entry);
}

#define list_entry(ptr, type, member) 
container_of(ptr, type, member)

#define __list_for_each(pos, head) 
for (pos = (head)->next; pos != (head); pos = pos->next)


#endif
其中的main.c 中
一段代码  
 __list_for_each(cur, &list) {
    datap = list_entry(cur, struct score, node);
    print_s(datap);
}
根据他作的宏定义逆推
产生这样的一段代码
for (cur = (&list)->next; cur != (&list); cur = cur->next)
{
            datap=(struct score *)( (char *)cur - ((size_t) &((struct score *)0)->node)  //这一句是怎样执行的过程????????????????????
            print_s(datap);
       
}

|
这一句的作用是,从一个struct成员的地址,找到整个struct的地址。
cur是一个struct list_head类型的指针,指向某个score结构的node成员。&((struct score *)0)->node)是node成员在score结构里面的偏移量。

    
 
 

您可能感兴趣的文章:

  • Linux内核中影响tcp三次握手的一些协议配置
  • 我想学习linux桌面编程,那么有没有必要学习linux的内核以及内核的相关编程呢?
  • TCP协议四次断连过程介绍及Linux内核协议栈中相关设置项
  • 现有linux内核中共享内存机制如何移植到linux0.11内核中
  • Linux进程的内核栈和用户栈概念,相互关系及切换过程
  • 读懂 Linux 内核代码不难,难的是读懂 Linux 内核代码背后的哲学!
  • linux内核中的likely宏和unlikely宏介绍及用法
  • Linux中内核线程不访问内核态地址空间?
  • Linux下c/c++开发之程序崩溃(Segment fault)时内核转储文件(core dump)生成设置方法
  • linux为什么要升级内核?升级内核有何作用?
  • 请问linux中如何判断内核是否已经启动。(在内核中写程序)
  • 《Linux内核情景分析》值得推荐的内核学习参考两用资料
  • *******是不是对内核模块编程然后再重新编译内核就可以把此模块整合到linux系统中
  • Linux 编译内核之后 没办法选择内核版本
  • 想看linux内核源代码,另外手头上有一本《unix环境高级编程》,需要先把《unix环境高级编程》看完之后再看内核吗?
  • 请问重新编译LINUX内核是否能将没有用的外设的驱动程序删除并减少内核占有内存的资源?请好心人仕指教!
  • Linux内核工具包 TOMOYO Linux
  • 请问:构建嵌入式linux环境时,“Linux内核的移植”是达到什么目的啊?
  • 求教,Linux下键盘输入的所有数据都会经过Linux内核吗???
  • 高深问题:有了linux内核源代码如何做成一个linux操作系统
  • linux内核编译一定要在linux环境下么?
  • Linux c++虚函数(virtual function)简单用法示例代码
  • 为什么比较freebsd和linux的源代码,觉得linux的代码十分的庞大。。
  • Linux c++库boost unordered_set数据插入及查找代码举例
  • linux源代码的时间函数源代码
  • Linux c++库boost unordered_map数据插入及查找代码举例
  • RedHat Linux是开放源代码的吗?如何能看见它的源代码,如何进行修改?
  • Linux下c函数dlopen实现加载动态库so文件代码举例
  • windows下写的代码 gb2312 如何转成 LINUX和WINDOWS都可正常显示的代码
  • linux c 生成随机数srand函数和rand函数介绍及代码示例
  • Linux源代码中ata驱动为什么要调用pci驱动的代码
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • red linux8.0下,GCC在什么地方呀?什么地方有文档与样例程序?哪位大哥知道请告知?
  • 我早就听说LINUX大名就是找不到下载的地方!!!
  • 想学习linux 编程,请问一下,用什么版本的linux好啊,什么地方有下载?谢了
  • 在腾讯工作的话,linux都用在什么地方啊?期待回答
  • 什么地方可以下载最新的linux系统版本?
  • 在什么地方可以下载到完整的LINUX2.4原代码呢??绝对送分!!
  • 我用的是WinFast A340什么地方可以下载它的linux的驱动呢?
  • 有没有地方下载Linux?
  • 誰知道MYsql数据库下载的地方,(包含LINUX及window版本的)
  • Linux下TCP/Ip开发资料和源代码什么地方可以找到?
  • 在redhat linux 8.0 中文板上 , 有些地方出现乱码问题!
  • linux 只有终端窗口能输入 鼠标点任何地方都没反应 这是怎么回事?
  • linux下有类似于windows下的注册表,可以用来储存程序运行数据的地方吗
  • 关于LINUX下的各种配置,正式的说明文档一般在什么地方?
  • 请问:构建嵌入式linux环境时,“Linux内核的移植”是达到什么目的啊? iis7站长之家
  • 有谁知道suse linux 8.1下载的地方?在此谢过!
  • 哪个地方有下载linux服务器源代码?
  • linux 中 困惑的地方,求解答。
  • 请问:在LINUX下,USB移动磁盘在哪个地方?
  • linux系统运行php几分钟后出现假死情况请问需要设置什么地方?
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3