Chinaunix首页 | 论坛 | 博客
  • 博客访问: 235838
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 296
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-22 11:52
文章分类

全部博文(31)

文章存档

2018年(3)

2017年(11)

2016年(12)

2015年(5)

我的朋友

分类: LINUX

2015-08-17 20:31:32

   今天实现一个读配置文件的功能的时候,用struct file* filp = filp_open ()打开文件,然后对返回值进行if(filp == NULL) 的判断,本来以为这样
就算文件不存在也不会有问题了,谁知道测试的时候,文件不存在居然加载模块失败。原来文件不存在,filp的值不是NULL的。

上网一搜,发现有个前辈写的一篇文章刚好解释了这个问题,链接贴过来,方便以后查看
href="http://blog.chinaunix.net/uid-20196318-id-28769.html" target="_blank">blog.chinaunix.net/uid-20196318-id-28769.html
内核指针是有三种类型的,有效指针,空指针,无效指针
难怪看内核代码的时候,人家都是用if( IS_ERR(ptr)  来判断,而不是if(!ptr) 来判断的,以前看到的用IS_ERR的时候,还以为又是一个封装而已
没想到还是有特别的作用的,这内核果然很多各种精妙的地方。这个指针和长整型互换,在nf_conntrack 的hlist_null  中也是有这样的用法,
因为操作系统是是四个字节或者8个字节对齐的,地址值就一定是0结尾的
在初始化的时候,通过指定地址值的方式,指定hlist_nulls_head 的first指针的地址值是1结尾的,这样来判断是否是nulls node

#define INIT_HLIST_NULLS_HEAD(ptr, nulls) \
        ((ptr)->first = (struct hlist_nulls_node *) (1UL | (((long)nulls) << 1)))
这个长整型转指针的意思,应该是把这个长整型作为地址值赋给这个指针。

阅读(2152) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~