Как определить свои собственные значения errno?

StackOverflow https://stackoverflow.com/questions/128579

  •  02-07-2019
  •  | 
  •  

Вопрос

При разработке модуля (драйвера устройства, промежуточного программного обеспечения и т. д.), который будет работать в пространстве ядра, нам хотелось бы каким-то образом определить причину, по которой операция может завершиться неудачей.

В VxWorks механизм errno кажется хорошим способом сделать это.

Можно ли определить свои собственные значения ошибок?

Это было полезно?

Решение

В контексте VxWorks errno определяется как два 16-битных:

  • Старшие 16 бит идентифицируют «модуль», в котором произошла ошибка.
  • Младшие 16 бит представляют конкретную ошибку для этого модуля.

Официальные значения модуля vxWorks (для errno) находятся в файле ../h/vwModNum.h.В настоящее время они используют несколько сотен номеров.Все эти номера модулей имеют вид

#define M_something   (nn <<  16)

Это сильно не рекомендуется изменять этот (или любой другой) файл заголовка vxWorks.

Что вы можете сделать, так это создать свой собственный файл заголовка модуля и начать с достаточно большого числа, чтобы не вызывать конфликтов.

/* myModNum.h */
#define M_MyModule     (10000 << 16)
#define M_MyNextModule (10001 << 16)
...

В отдельных файлах заголовков модулей создайте отдельные значения ошибок.

/* myModule.h */
#define S_MyModule_OutOfResources (M_MyModule | 1)
#define S_MyModule_InvalidHandle  (M_MyModule | 2)
...

Затем в своем коде вы можете установить errno для определенного вами макроса.

Другие советы

Errno — это просто число, а такие функции, как strerror(), возвращают текст описания.Если вы хотите расширить его, просто предоставьте собственную функцию, похожую на strerror(), которая просматривает ваш список ошибок или делегирует функции strerror().

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top