如何在Linux设备驱动程序中设置errno?

我正在devise一个Linux字符设备驱动程序。 我想在ioctl()系统调用中发生错误时设置errno

long my_own_ioctl(struct file *file, unsigned int req, unsigned long arg) { long ret = 0; BOOL isErr = FALSE; // some operation // ... if (isErr) { // set errno // ... <--- What should I do? ret = -1; } return ret; } 

我该怎么做才能做到这一点? 提前谢谢!


请允许我更详细地解释我的申请。

我的设备位于/ dev / myCharDev。 我的用户空间应用程序是这样的:

 #define _COMMAND (1) #define _ERROR_COMMAND_PARAMETER (-1) int main() { int fd = open("/dev/myCharDec", O_RDONLY); int errnoCopy; if (fd) { if (ioctl(fd, _COMMAND, _ERROR_COMMAND_PARAMETER) < 0) { // should cause error in ioctl() errnoCopy = errno; printf("Oops, error occurred: %s\n", strerr(errnoCopy)); // I want this "errno" printed correctly } close(fd); } return 0; } 

正如我在上面的评论中提到的那样,我应该如何在自己的设备驱动代码中设置“ errno ”,并使其可以被用户空间应用程序读取?

Solutions Collecting From Web of "如何在Linux设备驱动程序中设置errno?"

很好的问题!

好吧,你可以把errno看作是全局变量(是最hon的,这是一个extern int)。 errno在errno.h库中有很多预定义的错误代码。 你可以看看这里 这些错误代码很可能描述了您想要显示的内容。 拿起正确的,如果它是一个你定义的变量,(重要!)立即退出!

你可能会问自己,如果设置错误是你的问题的正确方法。 你总是可以定义一个(* int)并开发自己的错误代码和错误处理机制。 Errno的目的是显示和解释系统错误。 你认为你的代码是“系统”的一部分(因为我可以看到你开发自己的系统调用,所以这可能是这种情况)? 所以,继续使用errno来解释你的“系统错误”。

编辑(有问题更新):好的更多信息。 正如我所说的,errno是一个extern int,由内核设置。 errno的设置值就是系统调用的返回值。 然后Linux内核通过库errno.h解释这个负值。 因此,仅仅通过返回(EBUSY只是一个示例 – 您可以使用所有预先定义的错误类型)您希望从系统调用中的错误消息来设置示例错误消息。 例:

 return -EBUSY 

希望能帮助到你

从ioctl返回负面的错误号码。 C库解释这个,给出一个-1返回码,并设置errno为正误差。 例如,您的原始示例将设置errno为1。

另外,你的内核ioctl函数的原型看起来是错误的。 你正在使用哪个内核版本?

 if (isErr) { printk(KERN_ALERT "Error %d: your description\n", errno); ret = errno; } 

其中, errno是某个函数的返回值。

您的设备驱动程序应始终返回收到的请求的状态。 它主张你总是使用枚举的返回码以及正常的返回码。 返回0 =通过1或-1 =失败是模糊的,可能是误导。

阅读3.1节有效的错误处理,报告和恢复:了解更多信息