为什么file_operations中的unlocked_ioctl返回long,而sys / ioctl.h中的ioctl()返回int?

时间:2012-08-26 04:49:33

标签: c unix linux-kernel linux-device-driver ioctl

struct file_operations里面的unlocked_ioctl签名是

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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