Тип `stack_t` больше не определен в Linux?

Платформа 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, но здесь это, кажется, не определено?

2 ответа

Решение

Это должен быть комментарий, но я не могу сделать его там читабельным. Сожалею.

Ты #define одно из следующего:

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

Согласно 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. ...

И официальная страница руководства Linux для sigaltstack (версия 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.

Итак, когда вы используете glibc новее, чем 2.12, вы должны определить некоторые макросы, чтобы иметь возможность использовать sigaltstack а также stack_t, С glibc 2.10 вы можете просто определить #define _GNU_SOURCE включить _BSD_SOURCE а также _POSIX_C_SOURCE = 200809L

Другие вопросы по тегам