alloc_chrdev_region 返回值判断的问题

发布于 2022-09-23 12:48:28 字数 1848 浏览 10 评论 0

在dreamice 的 揭开字符设备驱动程序的面纱 文章中,分配设备号是这样的:

  1. 198   if (globalmem_major)
  2. 199     result = register_chrdev_region(devno, 1, "globalmem");
  3. 200   else  /*动态申请*/
  4. 201   {
  5. 202     result = alloc_chrdev_region(&devno, 0, 1, "globalmem");
  6. 203     globalmem_major = MAJOR(devno);
  7. 204   }
  8. 205   if (result < 0)
  9. 206     return result;

复制代码查了一下,alloc_chrdev_region原型:

  1. 233 int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,
  2. 234                         const char *name)
  3. 235 {
  4. 236         struct char_device_struct *cd;
  5. 237         cd = __register_chrdev_region(0, baseminor, count, name);
  6. 238         if (IS_ERR(cd))
  7. 239                return PTR_ERR(cd);
  8. 240         *dev = MKDEV(cd->major, cd->baseminor);
  9. 241         return 0;
  10. 242 }

复制代码PTR_ERR的定义:

  1. 27 static inline long PTR_ERR(const void *ptr)
  2. 28 {
  3. 29         return (long) ptr;
  4. 30 }

复制代码想问的是:为什么上面的判断是 if (result < 0)  啊? 按理说result应该是一个指针啊。

哪位知道的解释一下?

[ 本帖最后由 rossini23 于 2008-12-8 23:14 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

旧时浪漫 2022-09-30 12:48:29

这不能算是指针转换吧,只是把值的类型编程了long型。

辞旧 2022-09-30 12:48:29

你跟一下代码看一下吧,也包括指针转换的操作

醉殇 2022-09-30 12:48:29

把每一行代码结合宏看看就明白了。要不就是先作个precompile 一目了然!

尽揽少女心 2022-09-30 12:48:29

有道理,呵呵

灵芸 2022-09-30 12:48:28

这个是没有问题的,你仔细看一下__register_chrdev_region这个函数的返回值,虽然做了强制性指针的转换,但是return ERR_PTR(-ENOMEM);  -EBUSY等值实际上是一个负数,对负数做一个强制性转换。我们应该知道,所谓强制性转换,实际上并没有改变其值,而只是类型上的变化。所以,返回的实际上仍旧可以看成是一个负的错误码,这样的判断也就符合逻辑了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文