4

linux平台是Ubuntu 12.04

我的源代码中包含以下标头:

#include <unistd.h>
#include <signal.h>
#include <ucontext.h>

...

但是,当我编译它时,它会抱怨/usr/include/x86_64-linux-gnu/sys/ucontext.h:139:5: error: unknown type name 'stack_t'

我用谷歌搜索,发现stack_t应该在 中定义signal.h,但这里似乎没有定义?

4

2 回答 2

10

这是一个评论,但我不能让它在那里可读。对不起。

您是否#define 有以下情况之一:

 _BSD_SOURCE || _XOPEN_SOURCE >= 500 ||
           _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
           || /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
于 2013-12-26T03:31:35.037 回答
3

根据 SUS v2 (1997),stack_t应在<signal.h>- http://pubs.opengroup.org/onlinepubs/7908799/xsh/ucontext.h.html中定义

类型 sigset_t 和 stack_t 在 .

http://pubs.opengroup.org/onlinepubs/007908799/xsh/signal.h.html

标头将 stack_t 类型定义为至少包含以下成员的结构:

void     *ss_sp       stack base or pointer
size_t    ss_size     stack size
int       ss_flags    flags

该类型也在 glibc 文档中列出:http ://www.gnu.org/software/libc/manual/html_node/Signal-Stack.html

数据类型:stack_t

该类型在sigaltstack函数中使用,描述为:

sigaltstack 是较新的接口,来自 4.4 BSD。...

sigaltstack(版本 2015-07-23)的官方 Linux 手册页说:http: //man7.org/linux/man-pages/man2/sigaltstack.2.html

glibc 的功能测试宏要求(参见feature_test_macros(7)):

   sigaltstack():
       _BSD_SOURCE || _XOPEN_SOURCE >= 500 ||
       _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
       || /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L

符合 POSIX.1-2001、POSIX.1-2009、SUSv2、SVr4。

所以,当你使用比 2.12 更新的 glibc 时,你必须定义一些宏才能使用sigaltstackstack_t. 从 glibc 2.10 开始,您只需定义#define _GNU_SOURCE启用_BSD_SOURCE_POSIX_C_SOURCE = 200809L

于 2015-09-26T14:27:42.023 回答