sys/siginfo.h 的可移植性使用哪种方法

portability of the sys/siginfo.h which approach to use

我正在将旧代码从 Solaris 移植到 Linux。在一个文件中,我包含:

#include <sys/siginfo.h>

当然我在 Linux 中找不到它了。 所以我尝试将新的包含在:

#include <asm/siginfo.h>

但是我在尝试编译它时遇到了很多问题(当然)并且出现了如下错误:

/usr/include/asm-generic/siginfo.h:8:15: error: redefinition of ‘union sigval’
/usr/include/asm-generic/siginfo.h:11:3: error: conflicting declaration ‘typedef int sigval_t’
} sigval_t;

等等。 所以我想也许我可以更独立于操作系统并尝试直接使用标准:

#include <signal.h>

它让以前的错误消失了。但我当然得到了:

error: ‘SIGLOST’ was not declared in this scope

但这样我可以用一些新的宏替换它.. 我的问题是:将旧 sys/siginfo.h 移植到新环境的最佳方法是什么。使用 POSIX 标准或 asm/siginfo.h?还是其他?

绝对#include <signal.h>。如果您查看 linux/siginfo.h,它会警告您不要直接包含该文件,而是使用 signal.h。 POSIX 信号的 public API。

manpage 表明在其他 x86/ARM/most 上,未使用 SIGLOST。您可能正在访问您的端口的一部分,这将比大多数端口花费更多的精力。您将需要了解 SIGLOST 处理在您的代码中完成的功能。特别是,如果代码实现并需要文件锁定,则存在平台相关的 API 和行为。在这种情况下,您可以考虑完全重写文件锁定模块以确保行为正确。

除非你能完全删除它。在花时间在这里之前,请确保您了解文件锁定的局限性。比如咨询锁和强制锁的区别(后者在Linux上是不可靠的)。