【问题标题】:IOCTL call and checking return valueIOCTL 调用和检查返回值
【发布时间】:2013-02-19 21:55:49
【问题描述】:
if((err = ioctl(fd, IOC_CARD_LOCK, &lock)) < 0)
{
     printf("ioctl failed and returned errno %d \n",err);
}

上面的代码是否正确并且是一种良好的编程习惯?它确实在我的电脑上编译。 即它是否使用ioctl 的返回值填充err 并检查err 是否为&lt; 0

上述方法是返回 IOCTL 返回的“err”的标准方法吗?

似乎有一些标准变量叫做errno? 它是什么?会和上面一样吗?

【问题讨论】:

    标签: ioctl errno


    【解决方案1】:

    我找到了一种更好的方法。

    if(ioctl(fd, IOC_CARD_LOCK, &lock) < 0)
    {
         printf("ioctl failed and returned errno %s \n",strerror(errno));
    }
    

    errno 是为系统调用设置的全局变量。strerror 将代码(负整数)转换为有意义的字符串(例如“无效参数”。)

    【讨论】:

      【解决方案2】:

      只是偶然发现了这个回复。答案只是部分正确,因为 printf 可能会覆盖 errno - 根据手册页,必须保存 errno。所以更可靠的答案是:

      if(ioctl(fd, IOC_CARD_LOCK, &lock) < 0)
      {
          int errsv = errno;
          printf("ioctl failed and returned errno %s \n",strerror(errsv));
      }
      

      【讨论】:

      • 但是C不是按值调用吗?在调用printf 之前不会评估strerror(errno) 吗?
      猜你喜欢
      • 2014-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多