【问题标题】:Why unlocked_ioctl in file_operations returns long, while ioctl() from sys/ioctl.h returns int?为什么 file_operations 中的 unlocked_ioctl 返回 long,而 sys/ioctl.h 中的 ioctl() 返回 int?
【发布时间】:2012-08-21 02:19:56
【问题描述】:

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。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 啊,谢谢。起初我猜它会发生,但实验证明这个猜想是错误的——至少看起来是这样。我刚刚重新检查了代码,似乎我同时使用了另一个更改 errno 的函数。
    猜你喜欢
    • 2013-06-09
    • 1970-01-01
    • 2019-10-12
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多