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)
希望能帮助到你
从ioctl返回负的错误号.c库解释这个并给出-1返回码并将errno设置为正误差.例如,您的原始示例将errno设置为1.
另外,你在内核中使用ioctl函数的原型看起来是错误的.您使用的是哪个内核版本?