Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1727993
  • 博文数量: 782
  • 博客积分: 2455
  • 博客等级: 大尉
  • 技术积分: 4140
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-06 21:37
个人简介

Linux ,c/c++, web,前端,php,js

文章分类

全部博文(782)

文章存档

2015年(8)

2014年(28)

2013年(110)

2012年(307)

2011年(329)

分类:

2012-06-20 17:00:39

之前在我的blog中转载了linux内核链表分析,其中分析和例子是基于2。6的内核的 ,最近在作2.4的东西,于是顺便将例子改成了2.4内核可以通过的版本  。呵呵 反正都改了就贴出来了 。
 
/*********************************************************************
 *               
 * Filename:      pfile.c
 * Version:       1.0
 * Description:   Demo for Linux LIST utility
 * Compilation:   gcc -D__KERNEL__ -I/usr/src/linux/include pfile.c
 * Status:        Stable
 * Author:        Yang Shazhou<>
 * Created at:    Thu Jul 15 13:50:33 2004
 * Modified at:   Thu Jul 15 14:39:03 2004
 * Modified by:   Yang Shazhou<>
 *
 *     Copyright (c) 2004 Yang Shazhou, All Rights Reserved.
 *    
 *     This program is free software; you can redistribute it and/or
 *     modify it under the terms of the GNU General Public License as
 *     published by the Free Software Foundation; either version 2 of
 *     the License, or (at your option) any later version.
 *
 *     This program is distributed in the hope that it will be useful,
 *     but WITHOUT ANY WARRANTY; without even the implied warranty of
 *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 *     GNU General Public License for more details.
 *
 *     You should have received a copy of the GNU General Public License
 *     along with this program; if not, write to the Free Software
 *     Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *     MA 02111-1307 USA
 *    
 ********************************************************************/
#include
#include
#include
int main(int argc,char *argv[])
{
 LIST_HEAD(list);  //定义存放文件内容的链表
 FILE *fp;
 struct file_store {
  char c;
  struct list_head node;
 } *pstore;
 if(argc<2){
  printf("usage: pfile <[r]>\n");
  return -1;
 }
 if(!(fp=fopen(argv[1],"rb"))){
  printf("fopen(%s) error\n",argv[1]);
         return -1;
 }
 /* 读文件到链表 */
 while(1){
  if(!(pstore=(struct file_store *)malloc(sizeof(struct file_store))))
   break;
  pstore->c=fgetc(fp);
  printf("input %c\n " ,pstore->c) ;
  if(feof(fp)){
   free(pstore);
   break;
  }
  list_add_tail(&pstore->node,&list);   //将本字符插入链表中
 }
 fclose(fp);
 /* 遍历链表,输出链表中的节点个数,即文件字符数 */
 int count=0;
 struct list_head *p;
 list_for_each(p,&list){
  count++;
 }
 printf("%s has altogether %d character(s)\n",argv[1],count);
       
 /* 根据命令行参数正向/反向遍历链表,输出链表中存放的字符,同时释放各节点 */
 /*if(argc>2 && !strcasecmp(argv[2],"r")){
  struct list_head *p;
  list_for_each_entry_reverse(pstore,&list,node){  //反向遍历,没有保护
   p=pstore->node.next;
   list_del(&pstore->node);
   putchar(pstore->c);
   free(pstore);
   // 如果没有这一句,将报segmentation fault //
pstore=list_entry(p,struct file_store,node); //取数据项
  }
 }else */{
  struct file_store *pstorenode;
  struct list_head *p ,*n;
  int k = 0 ;
    // list_for_each_entry_safe(pstore,p,&list,node){  //正向遍历,有保护
    //  list_for_each(p,&list) {
   list_for_each_safe(p, n,&list) {
         pstorenode = list_entry(p ,struct file_store ,node)  ;
   putchar(pstorenode->c);
   //list_del_init(&(pstorenode->node));
   k++ ;
   if( k ==7) break ;
   free(pstorenode);
  }
 }
 return 0;
}
阅读(963) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~