3
if((err = ioctl(fd, IOC_CARD_LOCK, &lock)) < 0)
{
     printf("ioctl failed and returned errno %d \n",err);
}

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

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

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

4

2 回答 2

12

我找到了一个更好的方法来做到这一点。

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

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

于 2013-02-19T22:12:58.683 回答
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));
}
于 2016-12-20T09:55:16.673 回答