c-为什么file_operations中的unlocked_octl返回long,而sys/ictl.h中的ioctl



中struct file_operations内部unlocked_octl的签名是

long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);

而人2 ioctl说ioctl(2)的签名是:

int ioctl(int d, int request, ...);

我知道内核中的参数是如何被破坏的,但为什么内核空间中的返回类型是长的,而用户空间是int?当我想将负值作为错误返回时,这会产生一个问题:由于使用了双补码编码,我返回的所有负值都会变成-1。

如果从file_operations函数返回负值,内核将其解释为负errno(即错误返回)。然后,用户代码获取-1作为返回值,errno设置为原始返回值的负值。这与二的补码无关。

根据man 2 intro,"系统调用介绍":

在出错时大多数系统调用返回负错误号(即。,errno(3)中描述的常数之一的取反值)。C库包装器对调用程序隐藏了此详细信息:系统调用返回一个负值,包装器复制绝对值输入到errno变量中,并返回-1作为包装器的返回值。

例如,如果从unlocked_ioctl返回-ENOTTY,则用户程序从ioctlerrno = ENOTTY得到-1。

最新更新