Тип `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