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'
我用Google搜索,发现stack_t
应该在signal.h
中定义,但这里似乎没有定义?
答案 0 :(得分:10)
这是一个评论,但我不能让它在那里可读。遗憾。
你有#define
以下其中一个:
_BSD_SOURCE || _XOPEN_SOURCE >= 500 ||
_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
|| /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
答案 1 :(得分:2)
根据SUS v2(1997),应在stack_t
- http://pubs.opengroup.org/onlinepubs/7908799/xsh/ucontext.h.html
<signal.h>
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
的官方Linux手册页(2015-07-23版)说: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时,您必须定义一些宏才能使用sigaltstack
和stack_t
。自glibc 2.10起,您只需定义#define _GNU_SOURCE
即可启用_BSD_SOURCE
和_POSIX_C_SOURCE = 200809L