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 になるのに、カーネル空間の戻り値の型が長いのはなぜですか? これは、エラーとして負の値を返したい場合に問題を引き起こします。2 の補数のエンコーディングのため、返す負の値はすべて -1 に変換されます。

4

1 に答える 1

4

関数から負の値を返すfile_operationsと、カーネルはそれを負として解釈しますerrno(つまり、エラーが返されます)。ユーザーコードは、元の戻り値の否定に設定さ-1れた戻り値として取得されます。errnoこれは 2 の補数とは関係ありません。

-ENOTTY例として、から戻った場合、ユーザー プログラムはとunlocked_ioctlから -1 を取得します。ioctlerrno = ENOTTY

于 2012-08-26T04:56:02.313 に答える