将依赖sys/siginfo.h的代码从Solaris移植到Linux的最优方案是什么
移植方案说明
- 最优选择是使用POSIX标准的
#include <signal.h>,禁止直接引用asm/siginfo.hasm/siginfo.h属于内核态头文件,设计上就不面向用户态程序开放,直接引用必然会和glibc提供的标准信号类型、宏定义产生冲突,你遇到的union sigval重定义、sigval_t声明冲突都是该问题的典型表现。除此之外内核头文件没有跨版本、跨发行版的兼容性保证,即使临时修改通过编译,后续系统升级也大概率再次出现报错。 - 针对
SIGLOST这类平台特有宏缺失的问题,按照如下规则处理即可:- 先排查业务代码是否真的依赖该宏:如果旧代码中没有对应信号的处理逻辑,直接删除相关引用即可
- 确实需要保留相关逻辑的,在引入
signal.h之后补充条件编译的自定义宏,参考实现如下:
#include <signal.h> /* 兼容Solaris特有信号定义 */ #ifndef SIGLOST // Linux下默认将SIGLOST别名映射为SIGPWR,也可根据业务需求替换为其他未占用的信号值 #define SIGLOST SIGPWR #endif - 如果代码中用到了
siginfo_t结构体的Solaris特有字段,也遵循相同处理逻辑:优先使用POSIX标准规定的公共字段,特有字段通过条件编译做平台适配即可,不要为了少量平台特有定义放弃标准头文件的兼容性。
内容的提问来源于stack exchange,提问作者Apollo17
相关产品推荐
相关产品推荐

