linux上是否不再定义“stack\u t”类型?

linux上是否不再定义“stack\u t”类型?,c,linux,ucontext,C,Linux,Ucontext,linux平台是Ubuntu 12.04 我的源代码中包含以下标题: #include <unistd.h> #include <signal.h> #include <ucontext.h> ... #包括 #包括 #包括 ... 然而,当我编译它时,它会抱怨/usr/include/x86\u 64-linux-gnu/sys/ucontext.h:139:5:错误:未知类型名“stack\u t” 我在谷歌上搜索发现,stack\u t应该在sig

linux平台是Ubuntu 12.04

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

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

...
#包括
#包括
#包括
...
然而,当我编译它时,它会抱怨
/usr/include/x86\u 64-linux-gnu/sys/ucontext.h:139:5:错误:未知类型名“stack\u t”


我在谷歌上搜索发现,
stack\u t
应该在
signal.h
中定义,但在这里它似乎没有定义?

这是一个注释,但我无法使它在那里可读。对不起

您是否定义了以下内容之一:

 _BSD_SOURCE || _XOPEN_SOURCE >= 500 ||
           _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
           || /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
根据SUS v2(1997),
堆栈应在
-

sigset_t和stack_t类型的定义如中所示

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

glibc文档中也列出了该类型:

数据类型:stack\u t

此类型用于
sigaltstack
函数,描述如下:

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

sigaltstack
(版本2015-07-23)的官方Linux手册页上说:

glibc的特性测试宏要求(参见):

符合POSIX.1-2001、POSIX.1-2009、SUSv2、SVr4的要求


因此,当您使用比2.12更新的glibc时,必须定义一些宏才能使用
sigaltstack
stack\u t
。由于glibc 2.10,您只需定义
#define_GNU_SOURCE
即可启用
_BSD_SOURCE
_POSIX_C_SOURCE=200809L

谢谢!定义
\u BSD\u SOURCE
修复了我的问题。我想我现在的问题是,为什么要在linux上启用
stack\t
?@BeyondSora:
stack\t
是非标准的。任何非标准的都可以通过使用启用。您可以使用
-std=c99
-std=c11
;您最好使用
-std=gnu99
-std=gnu11
。或者,您可以添加适当的POSIX定义(
#定义(define)(XOPEN)源代码700
),或者(正如您所选择的那样)
#定义(u BSD)源代码
。决定何时提供额外设施以及何时不提供这些设施是复杂的。
void     *ss_sp       stack base or pointer
size_t    ss_size     stack size
int       ss_flags    flags
   sigaltstack():
       _BSD_SOURCE || _XOPEN_SOURCE >= 500 ||
       _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
       || /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L