linux上是否不再定义“stack\u t”类型?
linux平台是Ubuntu 12.04 我的源代码中包含以下标题: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
#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