【问题标题】:storage size of isn’t known using sigaltstack struct使用 sigaltstack 结构不知道存储大小
【发布时间】:2013-04-09 03:59:35
【问题描述】:

我正在使用 sigalstack 结构,详细信息在:

Here (MAC OSX)

HERE (LINUX)

我只是这样声明

struct sigaltstack aa;

我不断收到以下错误

error: storage size of ‘aa’ isn’t known

我阅读并检查了storage size of ‘names’ isn’t known,但我只是声明它,所以它并不真正适用。

【问题讨论】:

    标签: c linux unix struct


    【解决方案1】:

    您不能像那样只使用未初始化的备用堆栈。您必须在其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 */;
    

    希望对您有所帮助。

    【讨论】:

    • 我正在尝试在 static.usenix.org/event/usenix2000/general/full_papers/… 中运行 mctx_create 函数,该函数执行 struct sigaltstack ss;结构 sigaltstack oss;所以我不确定该代码是如何工作的。
    • 我不确定那个代码,但是你应该可以用struct stack_t替换每一个struct sigaltstack,记住#include <signal.h>;但正如@JonathanLeffler 指出的那样,该代码很旧。您可能还会遇到其他问题。
    • 2000 年可能还行的事情在 2013 年不再行得通。系统已经成熟; POSIX 标准版本已经存在了足够长的时间,人们预计不会再使用sigaltstack() 的预标准变体,因此也不会使用struct sigaltstack
    【解决方案2】:

    您链接到的Mac OS 页面显示(在“旧版概要”部分中):

    兼容性

    使用(过时的)sigaltstack 结构将导致编译器诊断。使用stack_t,定义在<signal.h>

    这表明您不应尝试使用struct sigaltstack。该页面还显示了您应该如何在 Mac OS 上执行此操作。 Linux 页面还显示了您应该如何使用 stack_t 类型,并且根本没有提及 struct sigaltstack

    【讨论】:

    • 它不再起作用了;你刚刚证明了这一点。正如我在对另一个答案的评论中指出的那样,2000 年可能还不错的事情在 2013 年不再可行。系统已经成熟; POSIX 标准版本已经存在了足够长的时间,人们预计不会再使用sigaltstack() 的预标准变体,因此也不会再使用struct sigaltstack。因此,来自 Usenix 2000 的示例代码不再有效。
    • 好的,谢谢,这很有帮助。关于如何移植它的任何想法?
    • vim:/struct sigaltstack/s//stack_t/g。这很粗糙但可能很有效,除非 Usenix 代码尝试做任何花哨的事情。旧接口必须考虑堆栈增长的方向;现代界面没有。因此,您需要确保更新后的 Usenix 代码不考虑堆栈增长的方向。我没有仔细检查代码以了解它的作用。
    猜你喜欢
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    相关资源
    最近更新 更多