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。
答案 0 :(得分:3)
如果从file_operations
函数返回负值,则内核会将其解释为负errno
(即错误返回)。然后,用户代码将-1
作为返回值,errno
设置为原始返回值的否定。这与二元补语无关。
例如,如果您从-ENOTTY
返回unlocked_ioctl
,则用户程序会从ioctl
和errno = ENOTTY
获得-1。