IOCTL返回值是什么?

5
我遇到了下面的代码。
if((error = ioctl(get_card_fd(card_ref), CARD_SETVERSION, &context)))
{
      return EXIT_FAILURE;
}

我的问题如下:

  1. Does IOCTL always return '0' on success?
  2. How does the following expression evaluate to a positive / TRUE ?

    (error = ioctl(get_card_fd(card_ref), CARD_SETVERSION, &context))
    
上述表达式如何在ioctl返回非零值时评估为真?

2
  1. 不。请阅读:http://man7.org/linux/man-pages/man2/ioctl.2.html
  2. 如果ioctl返回一个非0值,则计算结果为“true”。
- AntonH
@AntonH 你应该发布为答案 :) - Jesus Ramos
1
@JesusRamos 我应该回答,但由于这是一个如此简短/快速的答案,我认为这有点浪费答案。我会错过很多声望 :D - AntonH
@AntonH - 如果ioctl返回一个非零值,那么(2)如何评估为“true”? - liv2hak
因为在C语言中,0代表假,其他所有值都代表真。 - AntonH
1个回答

6
开发驱动程序的人需要处理这个 ioctl 请求,根据成功的情况返回什么值是由他自己决定的。通常情况下,0 表示一切正常。这个约定在 UNIX 系统中已经使用了很长时间。
无论如何,您需要阅读有关此特定文件描述符的文档,并知道由此文件描述符处理的特定系统调用返回什么值。
至于第二个问题,"=" 运算符在赋值后返回变量的新值。因此,如果赋值运算符返回非零值,则表达式的返回值(在我们的情况下是ioctl的int类型)将被隐式地评估为 true。
大多数情况下,非零的负值意味着执行出现错误。在某些情况下,UNIX 系统调用返回正值,如 read 或 write 系统调用。对于 read 和 write 系统调用,它们的正返回值表示所读取或写入的字节数。
可能会出现 ioctl 返回正值的情况,这可能表示执行正常,并且我们返回该特定文件描述符代表的某些状态。再次强调,认真阅读您的文档。
因此,在下面的代码中:
if (error = ioctl(get_card_fd(card_ref), CARD_SETVERSION, &context)) {
        return EXIT_FAILURE;
}

非零值被视为true,我们进入该条件代码块。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接