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

And*_*ang 10 linux ioctl driver errno device-driver

我正在设计一个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;
}
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能实现这一目标?提前谢谢你!


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

我的设备位于/ 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;
}
Run Code Online (Sandbox Code Playgroud)

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

ses*_*tus 12

好问题!

好吧,你可以把errno想象成全局变量(最好的是,它是一个extern int).errno在errno.h库中有大量用于错误代码的预定义宏.你可以看看这里.其中一些错误代码很可能描述了您想要显示的内容.拿起正确的一个,设置就好像它是你定义的变量,然后(重要!)立即退出!

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

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

return -EBUSY
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你


slo*_*aby 7

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

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