【发布时间】:2013-04-09 03:59:35
【问题描述】:
我正在使用 sigalstack 结构,详细信息在:
我只是这样声明
struct sigaltstack aa;
我不断收到以下错误
error: storage size of ‘aa’ isn’t known
我阅读并检查了storage size of ‘names’ isn’t known,但我只是声明它,所以它并不真正适用。
【问题讨论】:
我正在使用 sigalstack 结构,详细信息在:
我只是这样声明
struct sigaltstack aa;
我不断收到以下错误
error: storage size of ‘aa’ isn’t known
我阅读并检查了storage size of ‘names’ isn’t known,但我只是声明它,所以它并不真正适用。
【问题讨论】:
您不能像那样只使用未初始化的备用堆栈。您必须在其ss_sp 字段中为堆栈分配空间,并在其ss_size 字段中设置相应的大小。
您链接的 man7 链接有更多信息。其实在页面底部提供了一个例子:
stack_t ss;
ss.ss_sp = malloc(SIGSTKSZ);
if (ss.ss_sp == NULL)
/* Handle error */;
ss.ss_size = SIGSTKSZ;
ss.ss_flags = 0;
if (sigaltstack(&ss, NULL) == -1)
/* Handle error */;
希望对您有所帮助。
【讨论】:
struct stack_t替换每一个struct sigaltstack,记住#include <signal.h>;但正如@JonathanLeffler 指出的那样,该代码很旧。您可能还会遇到其他问题。
sigaltstack() 的预标准变体,因此也不会使用struct sigaltstack。
您链接到的Mac OS 页面显示(在“旧版概要”部分中):
兼容性
使用(过时的)
sigaltstack结构将导致编译器诊断。使用stack_t,定义在<signal.h>。
这表明您不应尝试使用struct sigaltstack。该页面还显示了您应该如何在 Mac OS 上执行此操作。 Linux 页面还显示了您应该如何使用 stack_t 类型,并且根本没有提及 struct sigaltstack。
【讨论】:
sigaltstack() 的预标准变体,因此也不会再使用struct sigaltstack。因此,来自 Usenix 2000 的示例代码不再有效。
vim::/struct sigaltstack/s//stack_t/g。这很粗糙但可能很有效,除非 Usenix 代码尝试做任何花哨的事情。旧接口必须考虑堆栈增长的方向;现代界面没有。因此,您需要确保更新后的 Usenix 代码不考虑堆栈增长的方向。我没有仔细检查代码以了解它的作用。