2016-06-18 8 views

ответ

3

Ядро Linux использует несколько различных методов для решения условий ошибок. В отличие от программ пользовательского пространства C, функции не сохраняют свой код ошибки в глобальной переменной, но возвращают значение напрямую. Как правило, видно, что это делается следующим образом:

  • Функции, которые не возвращают никакого значения, кроме кода ошибки обычно возвращают 0 при успехе и -ESOMETHING при неудаче.
  • Функции, которые могут возвращать неотрицательное числовое значение (например, индекс, номер дескриптора файла или длину в байтах), аналогичны: 0 или выше указывает на успешность, а отрицательные значения указывают на ошибки.
  • Функции, возвращающие указатели, могут возвращать значение в специальном диапазоне для указания ошибки. Вызвав IS_ERR() на возвращаемое значение, вы можете проверить, произошла ли ошибка. С помощью PTR_ERR() вы можете извлечь код ошибки, который снова отменяется.

К сожалению, функция kmalloc() не использует ни один из этих стилей. Он возвращает NULL после отказа, не указывая конкретный код ошибки.

+0

Спасибо Ed !!! – LiorGolan

+2

Я бы добавил, что 'kmalloc()' также может возвращать 'ZERO_SIZE_PTR' в случае, если предоставленный размер равен 0. Поэтому вы должны явно проверить свой размер перед вызовом' kmalloc() ', чтобы избежать обращения к' ZERO_SIZE_PTR'. Кроме того, рассмотрите возможность использования 'PTR_ERR_OR_ZERO()' вместо таких вещей, как 'PTR_RET()' (который теперь устарел), 'IS_ERR()' и 'PTR_ERR()'. –

+0

Кто-то может быть удивлен, увидев код NULL, возвращаемый malloc, когда размер равен 0! Поэтому будьте осторожны в коде. @SamProtsenko уже рассказал вам подробности. – 0andriy

1

В области ядра нет errno. Вы можете просто проверить возвращение функции ядра с если утверждение, например, для kmalloc():

struct dog *ptr; 

ptr = kmalloc(sizeof(struct dog), GFP_KERNEL); 
if (!ptr) 
    /* handle error ... */ 

Где вы регулируете свою ошибку вы могли бы решить, какой будет величина ERRNO в пользовательском пространстве только с :

return -ErrorName; 

Ядро Linux затем интерпретирует это отрицательное значение через библиотеку errno.h. Вы можете найти список ошибок, чтобы установить переменную errno в:

include/asm-generic/errno.h 
include/asm-generic/errno-base.h 
+0

Большое вам спасибо. Btw, зачем нам возвращать отрицательное значение ошибки? (Я видел, что все это делают на нескольких примерах в Интернете) – LiorGolan

+0

@LiorGolan это зависит от реализации syscall, который использует (в большинстве случаев) возвращаемое значение из ядра для заполнения значения errno. Можно сказать, что почти все syscall устанавливают errno, если возвращаемое значение из ядра отрицательное, нет конкретной причины, это конвекция – mik1904