是不是在linux上定义了`stack_t`类型?

时间:2013-12-26 03:26:47

标签: c linux ucontext

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中定义,但这里似乎没有定义?

2 个答案:

答案 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时,您必须定义一些宏才能使用sigaltstackstack_t。自glibc 2.10起,您只需定义#define _GNU_SOURCE即可启用_BSD_SOURCE_POSIX_C_SOURCE = 200809L