Как определить свои собственные значения errno?
Вопрос
При разработке модуля (драйвера устройства, промежуточного программного обеспечения и т. д.), который будет работать в пространстве ядра, нам хотелось бы каким-то образом определить причину, по которой операция может завершиться неудачей.
В 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().