2016-01-25 6 views
1

Мне нужно передать целое число в модуль ядра, вычислить там sin и вернуть результат.Как вернуть отрицательное целое число как действительный результат с помощью ioctl?

Прежде всего, ядро ​​имеет встроенный грех. fixp_t fixp_sin(unsigned int degrees) Функция, которая возвращает номер фиксированной точки (что может быть отрицательным).

Итак, мой вопрос: если я передаю целое число, используя ioctl для модуля ядра, вычислить грех, как я могу вернуть отрицательный результат обратно?

ioctl обнаруживает отрицательные значения возврата как ошибки.

+0

Я ожидаю возвращаемое значение 'int' из функции sine, все, что вы когда-либо получите, это' -1', '0' или' + 1'. –

+0

@WeatherVane Я полагаю, что трюк заключается в использовании чисел с фиксированной точкой. – avasin

+1

Возвращаемое значение ioctl всегда относится к * успеху * или * сбою * ioctl. Если у вас есть * data * для передачи или возврата из ioctl, вы всегда это делаете с помощью аргумента указателя. Хотя с учетом сказанного, скрытие функции sin() за ioctl кажется странным архитектурным выбором. –

ответ

2

Мне нужно передать целое число в модуль ядра, вычислить там sin и получить результат .

Вместо передачи целочисленного значения ioctl(), структура может быть передана. Эта структура может иметь поля ввода и вывода данных. Нет необходимости возиться с возвращаемыми значениями ioctl().

Образец IOCTL() с передачей структуры на символ драйвера
https://github.com/jeyaramvrp/kernel-module-programming/tree/master/sample-char-dir

2

ioctl() никогда не имел в виду, чтобы возвращать значения с плавающей точкой. Но вы можете передать указатель на вашей памяти, пользовательское приложение может быть заполнено:

float f = 1.0; 
ioctl(fd, SIOCCALCSIN, &f); 

е является INOUT-параметром здесь, принимая значение, для которого вычислить синус и перезапись с результатом.

+2

AFAIK, это не очень хорошая идея использовать поплавки в модулях ядра. –

+0

@EugeneSh Я бы не видел причин, почему – Ctx

+0

@WeatherVane Я прочитал вопрос, что OP уже имеет средства для вычисления синуса в kernelspace. Его легко закодировать вручную. – Ctx