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

Apo*_*o17 1 c++ linux posix solaris

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

\n
#include <sys/siginfo.h>\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
#include <asm/siginfo.h>\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
\n

/usr/include/asm-generic/siginfo.h:8:15: 错误: 重新定义 \xe2\x80\x98union sigval\xe2\x80\x99
\n/usr/include/asm-generic/siginfo.h:11 :3: 错误:声明冲突 \xe2\x80\x98typedef int sigval_t\xe2\x80\x99
\n} sigval_t;

\n
\n

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

\n
#include <signal.h>\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
\n

错误:\xe2\x80\x98SIGLOST\xe2\x80\x99 未在此范围内声明

\n
\n

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

\n

Pet*_*ter 5

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

联机帮助页显示,在 x86/ARM/大多数其他平台上,不使用 SIGLOST。您可能会碰到端口的某个部分,这比大多数端口需要付出更多的努力。您需要了解 SIGLOST 处理在您的代码中完成什么功能。特别是,如果代码实现并需要文件锁定,则存在依赖于平台的 API 和行为。在这种情况下,您可能会考虑完全重写文件锁定模块,以确保行为正确。

除非你能把它彻底删除。在花时间阅读这里之前,请确保您了解文件锁定的限制。例如,咨询锁和强制锁之间的区别(后者在 Linux 上不可靠)。

  • FWIW,人们可以深入研究 [Illumos 源代码](https://github.com/illumos/illumos-gate/search?p=2&amp;q=SIGLOST) 以了解 Solaris 系统何时生成“SIGLOST”信号。 (2认同)