alloc_chrdev_region 返回值判断的问题
在dreamice 的 揭开字符设备驱动程序的面纱 文章中,分配设备号是这样的:
- 198 if (globalmem_major)
- 199 result = register_chrdev_region(devno, 1, "globalmem");
- 200 else /*动态申请*/
- 201 {
- 202 result = alloc_chrdev_region(&devno, 0, 1, "globalmem");
- 203 globalmem_major = MAJOR(devno);
- 204 }
- 205 if (result < 0)
- 206 return result;
复制代码查了一下,alloc_chrdev_region原型:
- 233 int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,
- 234 const char *name)
- 235 {
- 236 struct char_device_struct *cd;
- 237 cd = __register_chrdev_region(0, baseminor, count, name);
- 238 if (IS_ERR(cd))
- 239 return PTR_ERR(cd);
- 240 *dev = MKDEV(cd->major, cd->baseminor);
- 241 return 0;
- 242 }
复制代码PTR_ERR的定义:
- 27 static inline long PTR_ERR(const void *ptr)
- 28 {
- 29 return (long) ptr;
- 30 }
复制代码想问的是:为什么上面的判断是 if (result < 0) 啊? 按理说result应该是一个指针啊。
哪位知道的解释一下?
[ 本帖最后由 rossini23 于 2008-12-8 23:14 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
这不能算是指针转换吧,只是把值的类型编程了long型。
你跟一下代码看一下吧,也包括指针转换的操作
把每一行代码结合宏看看就明白了。要不就是先作个precompile 一目了然!
有道理,呵呵
这个是没有问题的,你仔细看一下__register_chrdev_region这个函数的返回值,虽然做了强制性指针的转换,但是return ERR_PTR(-ENOMEM); -EBUSY等值实际上是一个负数,对负数做一个强制性转换。我们应该知道,所谓强制性转换,实际上并没有改变其值,而只是类型上的变化。所以,返回的实际上仍旧可以看成是一个负的错误码,这样的判断也就符合逻辑了。