2

struct file_operations 中的 unlocked_ioctl 的签名是

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

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

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

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

4

1 回答 1

4

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

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

于 2012-08-26T04:56:02.313 回答