今天实现一个读配置文件的功能的时候,用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) |