kernel中的双链表的使用Linux认证考试

文章作者 100test 发表时间 2009:08:21 19:04:42
来源 100Test.Com百考试题网


  参考例子如下:
  你们可以把下面的代码粘贴到 自己的 代码里面去试验 , 我给的只是个代码片段而已 。 自己调试。
  关于链表操作的具体实现, 可以看kernel代码里面的 include/linux/list.h
  也可以在kernel代码中搜索 list_add/list_del/list_empty 等例子。
  //声明一个链表
  LIST_HEAD(bob_list).
  struct bob_jobs {
  unsigned long id.
  struct list_head list.
  }.
  #define this_job(p) list_entry(p, struct bob_jobs, list)
  static __init int chardev_init(void)
  {
  struct list_head *p = NULL.
  //begin
  struct bob_jobs job1 = {
  .id = 10UL,
  //.list = LIST_HEAD_INIT(list), 因为我们的结构体刚定义,list指针本身就是未知的,需要在list_add()才能对其进行操作,不用没法赋值。
  }.
  struct bob_jobs job2 = {
  .id = 20UL,
  //.list = LIST_HEAD_INIT(list), 因为我们的结构体刚定义,list指针本身就是未知的,需要在list_add()才能对其进行操作,不用没法赋值。
  }.
  Major = register_chrdev(0, DEVICE_NAME, &.fops).
  if (Major <. 0) {
  dbg("Registering the character device failed with %d\n", Major).
  return Major.
  }
  dbg("only debug the functions in list.h\n").
  INIT_LIST_HEAD(&.bob_list). //初始化链表
  list_add(&.(job1.list),&.bob_list).
  list_add(&.(job2.list),&.bob_list).
  //print ,遍历一下 ,
  list_for_each(p,&.bob_list)
  {
  struct bob_jobs *job = NULL.
  job = this_job(p).
  dbg("id=%lu\n",job->.id).
  }
  //试验完毕要删除链表, 但是这里面没有删除header ,因为header不是指针, 所以也就不用回收了。
  dbg("will 0delete the bob_list double list\n").
  while(bob_list.next != &.bob_list)
  {
  struct bob_jobs *job = NULL.
  p = bob_list.next.
  job = this_job(p).
  //0delete a entry after header
  // dbg("0delete a entry after header , id = %lu\n",(this_job(p))->.id).
  dbg("0delete a entry after header , id = %lu\n",job->.id).
  list_del(bob_list.next).
  }
  dbg("0delete over \n").
  return 0.
  }

相关文章


linuxqmail病毒_垃圾邮件处理Linux认证考试
在BSD上安装Nfsen网络流量工具Linux认证考试
删除Linux系统下的历史记录Linux认证考试
查找进程的pidLinux认证考试
kernel中的双链表的使用Linux认证考试
unix_Linux低级IO函数的用法Linux认证考试
用Perl从oracle导出百万级数据到excelLinux认证考试
将LINUX变成路由器Linux认证考试
开源代码及Linux系统在云计算中的应用Linux认证考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛