如何定义自己的errno值?

时间:2020-03-06 14:40:39  来源:igfitidea点击:

在开发将在内核空间中运行的模块(设备驱动程序,中间件等)时,我们希望有某种方法来捕获操作可能失败的原因。

在VxWorks中,errno机制似乎是实现此目的的好方法。

是否可以定义我自己的errno值?

解决方案

Errno只是一个数字,像strerror()这样的函数会返回描述文本。如果要扩展它,只需提供一个类似于strerror()的函数即可查看错误列表或者委托给strerror()。

在VxWorks上下文中,errno定义为两个16位:

  • 高16位标识发生错误的"模块"。
  • 低16位代表该模块的特定错误。

官方的vxWorks模块值(用于errno)位于../h/vwModNum.h文件中。
他们目前正在使用数百个数字。
这些模块编号均具有以下形式:

#define M_something   (nn &lt&lt  16)

强烈建议不要修改此(或者任何)vxWorks头文件。

我们可以做的是创建自己的模块头文件,并以足够大的数量开始而不引起冲突。

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

在各个模块头文件中,创建各个errno值。

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

然后,可以在代码中将errno设置为定义的宏。