sigaltstack

SIGALTSTACK(2)  Ð ÑководÑÑво пÑогÑаммиÑÑа Linux  SIGALTSTACK(2)



ÐÐЯ
       sigaltstack - ÑÑиÑÑÐ²Ð°ÐµÑ Ð¸Ð»Ð¸ ÑÑÑанавливаеÑ
       ÑаÑположение ÑÑека Ñигналов

ÐÐÐÐÐ
       #include <signal.h>

       int sigaltstack(const stack_t *ss, stack_t *oss);

   ТÑÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð°ÐºÑоÑа ÑеÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑвойÑÑв Ð´Ð»Ñ glibc
   (Ñм. feature_test_macros(7)):

       sigaltstack():
           _XOPEN_SOURCE >= 500
               || /* наÑÐ¸Ð½Ð°Ñ Ñ glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
               || /* в веÑÑии glibc <= 2.19: */ _BSD_SOURCE

ÐÐÐСÐÐÐÐ
       ÐÑзов sigaltstack() позволÑÐµÑ Ð¿ÑоÑеÑÑÑ Ð¾Ð¿ÑеделиÑÑ
       новÑй алÑÑеÑнаÑивнÑй ÑÑек Ñигналов и/или
       полÑÑиÑÑ ÑоÑÑоÑние Ñже имеÑÑегоÑÑ
       алÑÑеÑнаÑивного ÑÑека Ñигналов.
       ÐлÑÑеÑнаÑивнÑй ÑÑек Ñигналов иÑполÑзÑеÑÑÑ Ð¿Ñи
       вÑполнении обÑабоÑÑика Ñигналов, еÑли он
       бÑл запÑоÑен пÑи ÑÑÑановлении обÑабоÑÑика
       (Ñм. sigaction(2)).

       ÐбÑÑнÑй поÑÑдок дейÑÑвий Ð´Ð»Ñ Ð¸ÑполÑзованиÑ
       алÑÑеÑнаÑивного ÑÑека Ñигналов:

       1. ÐÑделиÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¿Ð°Ð¼ÑÑи, коÑоÑÐ°Ñ Ð±ÑдеÑ
          иÑполÑзована под алÑÑеÑнаÑивнÑй ÑÑек
          Ñигналов.

       2. ÐÑзваÑÑ sigaltstack() Ð´Ð»Ñ Ð¸Ð½ÑоÑмиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑиÑÑемÑ
          о ÑÑÑеÑÑвовании и ÑаÑположении
          алÑÑеÑнаÑивного ÑÑека Ñигналов.

       3. ÐÑи ÑÑÑановке обÑабоÑÑика Ñигналов Ñ
          помоÑÑÑ sigaction(2) (Ñлагом SA_ONSTACK) ÑообÑиÑÑ
          ÑиÑÑеме, ÑÑо обÑабоÑÑик Ñигналов должен
          вÑполнÑÑÑÑÑ Ñ Ð°Ð»ÑÑеÑнаÑивнÑм ÑÑеком
          Ñигналов.

       ÐÑгÑÐ¼ÐµÐ½Ñ ss иÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾
       алÑÑеÑнаÑивного ÑÑека Ñигналов, а аÑгÑменÑ
       oss иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¸Ð½ÑоÑмаÑии об
       ÑÑÑановленном в даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑÑеке
       Ñигналов. ÐÑли инÑеÑеÑÑÐµÑ ÐºÐ°ÐºÐ°Ñ-Ñо одна из
       ÑÑÐ¸Ñ Ð·Ð°Ð´Ð°Ñ, Ñо дÑÑгой аÑгÑÐ¼ÐµÐ½Ñ ÑказÑваеÑÑÑ ÐºÐ°Ðº
       NULL. ÐаждÑй из аÑгÑменÑов пÑедÑÑавлÑÐµÑ ÑÑÑÑкÑÑÑÑ
       ÑледÑÑÑего вида:

           typedef struct {
               void  *ss_sp;     /* базовÑй адÑÐµÑ ÑÑека */
               int    ss_flags;  /* Ñлаги */
               size_t ss_size;   /* колиÑеÑÑво Ð±Ð°Ð¹Ñ Ð² ÑÑеке */
           } stack_t;

       ЧÑÐ¾Ð±Ñ Ð·Ð°Ð´Ð°ÑÑ Ð½Ð¾Ð²Ð¾Ð¹ алÑÑеÑнаÑивнÑй ÑÑек
       Ñигналов поле ss.ss_flags ÑÑÑанавливаеÑÑÑ Ð²
       нолÑ, а в ss.ss_sp и ss.ss_size ÑказÑваÑÑÑÑ Ð½Ð°ÑалÑнÑй
       адÑÐµÑ Ð¸ ÑÐ°Ð·Ð¼ÐµÑ ÑÑека. ÐÐ»Ñ Ð¾Ð¿ÑеделениÑ
       алÑÑеÑнаÑивного ÑÑека Ñигналов
       доÑÑаÑоÑного ÑазмеÑа можно иÑполÑзоваÑÑ
       конÑÑанÑÑ SIGSTKSZ, а Ð´Ð»Ñ Ð²ÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑека
       минималÑного ÑазмеÑа можно ÑказаÑÑ
       конÑÑанÑÑ MINSIGSTKSZ.

       ÐÑи вÑзове обÑабоÑÑика Ñигнала Ñ
       алÑÑеÑнаÑивнÑм ÑÑеком ÑдÑо авÑомаÑиÑеÑки
       вÑÑÐ°Ð²Ð½Ð¸Ð²Ð°ÐµÑ Ð°Ð´ÑеÑ, ÑказаннÑй в ss.ss_sp, по
       гÑаниÑе адÑеÑа, подÑодÑÑей Ð´Ð»Ñ Ð¸ÑполÑзÑемой
       аппаÑаÑной плаÑÑоÑмÑ.

       ÐÐ»Ñ Ð¾ÑклÑÑÐµÐ½Ð¸Ñ ÑÑÑеÑÑвÑÑÑего ÑÑека, ÑкажиÑе в
       ss.ss_flags знаÑение SS_DISABLE. Ð ÑÑом ÑлÑÑае
       оÑÑалÑнÑе Ð¿Ð¾Ð»Ñ Ð² ss игноÑиÑÑÑÑÑÑ.

       ÐÑли oss не Ñавно NULL, Ñо в нÑм возвÑаÑаеÑÑÑ
       инÑоÑмаÑÐ¸Ñ Ð¾Ð± алÑÑеÑнаÑивном ÑÑеке
       Ñигналов, коÑоÑÑй иÑполÑзовалÑÑ Ð´Ð¾ ÑÑого
       вÑзова sigaltstack(). РполÑÑ oss.ss_sp и oss.ss_size
       возвÑаÑаÑÑÑÑ Ð½Ð°ÑалÑнÑй адÑÐµÑ Ð¸ ÑÐ°Ð·Ð¼ÐµÑ ÑÑека. Ð
       oss.ss_flags Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ð¾Ð·Ð²ÑаÑено одно из
       ÑледÑÑÑÐ¸Ñ Ð·Ð½Ð°Ñений:

       SS_ONSTACK
              РданнÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð°Ð»ÑÑеÑнаÑивнÑй ÑÑек
              Ñигналов иÑполÑзÑеÑÑÑ Ð¿ÑоÑеÑÑом
              (замеÑим, ÑÑо в ÑÑÐ¾Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾
              измениÑÑ Ð°Ð»ÑÑеÑнаÑивнÑй ÑÑек Ñигналов).

       SS_DISABLE
              РданнÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð°Ð»ÑÑеÑнаÑивнÑй ÑÑек
              Ñигналов вÑклÑÑен.

ÐÐÐÐÐ ÐЩÐÐÐÐÐ ÐÐÐЧÐÐÐÐ
       ÐÑи ÑÑпеÑном вÑполнении sigaltstack()
       возвÑаÑаеÑÑÑ 0. Ð ÑлÑÑае оÑибки возвÑаÑаеÑÑÑ -1,
       а errno ÑÑÑанавливаеÑÑÑ Ð² ÑооÑвеÑÑÑвÑÑÑее
       знаÑение.

ÐШÐÐÐÐ
       EFAULT ÐнаÑение ss или oss не Ñавно NULL и
              ÑказÑÐ²Ð°ÐµÑ Ð·Ð° пÑÐµÐ´ÐµÐ»Ñ Ð°Ð´ÑеÑного
              пÑоÑÑÑанÑÑва пÑоÑеÑÑа.

       EINVAL ÐнаÑение ss не Ñавно NULL и в поле ss_flags
              ÑодеÑжиÑÑÑ Ð½ÐµÐ½Ñлевое знаÑение, не
              Ñавное SS_DISABLE.

       ENOMEM УказаннÑй ÑÐ°Ð·Ð¼ÐµÑ Ð½Ð¾Ð²Ð¾Ð³Ð¾
              алÑÑеÑнаÑивного ÑÑека Ñигналов ss.ss_size
              менÑÑе MINSTKSZ.

       EPERM  ÐÑла попÑÑка измениÑÑ Ð°Ð»ÑÑеÑнаÑивнÑй
              ÑÑек Ñигналов пÑи его акÑивноÑÑи (Ñ. е.
              ÑекÑÑий алÑÑеÑнаÑивнÑй ÑÑек Ñигналов Ñже
              задейÑÑвован пÑи вÑполнении пÑоÑеÑÑа).

ÐТРÐÐУТЫ
       ÐпиÑание ÑеÑминов данного Ñаздела ÑмоÑÑиÑе
       в attributes(7).

       ┌──────────────┬────────────────────────────────┬────────────────┐
       │ÐнÑеÑÑÐµÐ¹Ñ ÐÑÑибÑÑ                      ÐнаÑение │
       ├──────────────┼────────────────────────────────┼────────────────┤
       │sigaltstack() │ ÐезвÑедноÑÑÑ Ð² ниÑÑÑ │ MT-Safe        │
       └──────────────┴────────────────────────────────┴────────────────┘

СÐÐТÐÐТСТÐÐРСТÐÐÐÐРТÐÐ
       POSIX.1-2001, POSIX.1-2009, SUSv2, SVr4.

ÐÐÐÐЧÐÐÐЯ
       РоÑновном, алÑÑеÑнаÑивнÑй ÑÑек Ñигналов
       иÑполÑзÑеÑÑÑ Ð¿Ñи обÑабоÑке Ñигнала SIGSEGV,
       коÑоÑÑй Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¿Ñи неÑваÑке Ñвободного
       меÑÑа в обÑÑном ÑÑеке пÑоÑеÑÑа: в ÑÑом ÑлÑÑае
       обÑабоÑÑик Ñигнала SIGSEGV не можеÑ
       иÑполÑзоваÑÑ ÑÑек пÑоÑеÑÑа; еÑли ÑÑебÑеÑÑÑ
       обÑабоÑка данного Ñигнала, нÑжно
       иÑполÑзоваÑÑ Ð°Ð»ÑÑеÑнаÑивнÑй ÑÑек Ñигналов.

       ÐазнаÑение алÑÑеÑнаÑивного ÑÑека Ñигналов
       полезно, еÑли ожидаеÑÑÑ, ÑÑо пÑоÑеÑÑ Ð¼Ð¾Ð¶ÐµÑ
       задейÑÑвоваÑÑ Ð²ÐµÑÑ Ñвой обÑÑнÑй ÑÑек. ÐÑо
       Ð¼Ð¾Ð¶ÐµÑ ÑлÑÑиÑÑÑÑ, напÑимеÑ, когда ÑÑек
       ÑÑановиÑÑÑ Ð½Ð°ÑÑолÑко болÑÑим, ÑÑо он вÑÑÑеÑаеÑÑÑ
       Ñ ÑаÑÑÑÑей в ввеÑÑ Â«ÐºÑÑей», или доÑÑигаеÑ
       огÑаниÑениÑ, заданного вÑзовом
       setrlimit(RLIMIT_STACK, &rlim). ÐÑли ÑÑандаÑÑнÑй ÑÑек
       законÑилÑÑ, Ñо ÑдÑо поÑÑÐ»Ð°ÐµÑ Ð¿ÑоÑеÑÑÑ Ñигнал
       SIGSEGV. Ð ÑÑÐ¸Ñ ÑÑловиÑÑ ÐµÐ´Ð¸Ð½ÑÑвеннÑм ÑпоÑобом
       поймаÑÑ Ñигнал бÑÐ´ÐµÑ Ð·Ð°Ð´ÐµÐ¹ÑÑвование
       алÑÑеÑнаÑивного ÑÑека Ñигналов.

       Ðа болÑÑинÑÑве аппаÑаÑнÑÑ Ð°ÑÑиÑекÑÑÑ,
       поддеÑживаемÑÑ Linux, ÑÑеки ÑаÑÑÑÑ ÑвеÑÑÑ Ð²Ð½Ð¸Ð·.
       ÐÑзов sigaltstack() авÑомаÑиÑеÑки ÑÑÑÑÑ
       напÑавление ÑоÑÑа ÑÑека.

       ФÑнкÑии, вÑзÑваемÑе из обÑабоÑÑика
       Ñигналов иÑполнÑемого Ñ Ð¸ÑполÑзованием
       алÑÑеÑнаÑивного ÑÑека Ñигналов, Ñакже бÑдÑÑ
       иÑполÑзоваÑÑ Ð°Ð»ÑÑеÑнаÑивнÑй ÑÑек Ñигналов
       (ÑÑо Ñакже пÑименимо к лÑбÑм обÑабоÑÑикам,
       вÑзваннÑм по дÑÑгим Ñигналам в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº
       пÑоÑеÑÑ Ð²ÑполнÑеÑÑÑ Ñ Ð°Ð»ÑÑеÑнаÑивнÑм ÑÑеком
       Ñигналов). РоÑлиÑие Ð¾Ñ ÑÑандаÑÑного ÑÑека
       ÑиÑÑема авÑомаÑиÑеÑки не ÑаÑÑиÑÑеÑ
       алÑÑеÑнаÑивнÑй ÑÑек Ñигналов. ÐÑевÑÑение
       вÑделенного ÑазмеÑа алÑÑеÑнаÑивного ÑÑека
       Ñигналов пÑиведÑÑ Ðº непÑедÑказÑемÑм
       ÑезÑлÑÑаÑам.

       ÐÑи ÑÑпеÑном вÑполнении вÑзова execve(2) лÑбой
       ÑÑÑеÑÑвÑÑÑий алÑÑеÑнаÑивнÑй ÑÑек Ñигналов
       ÑдалÑеÑÑÑ. ÐоÑеÑний пÑоÑеÑÑ, ÑозданнÑй Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
       fork(2), наÑледÑÐµÑ ÐºÐ¾Ð¿Ð¸Ñ Ð½Ð°ÑÑÑоек
       алÑÑеÑнаÑивного ÑÑека Ñигналов Ñвоего
       ÑодиÑелÑ.

       ÐÑзов sigaltstack() заменÑÐµÑ ÑÑÑаÑевÑий вÑзов
       sigstack(). ÐÐ»Ñ Ð¾Ð±ÑаÑной ÑовмеÑÑимоÑÑи в glibc
       Ñакже еÑÑÑ ÑÑнкÑÐ¸Ñ sigstack(). Ðо вÑÐµÑ Ð½Ð¾Ð²ÑÑ
       пÑиложениÑÑ Ð½Ñжно иÑполÑзоваÑÑ sigaltstack().

   ÐÑÑоÑиÑ
       СиÑÑемнÑй вÑзов sigstack() поÑвилÑÑ Ð² 4.2BSD. РнÑм
       иÑполÑзовалаÑÑ Ñлегка дÑÑÐ³Ð°Ñ ÑÑÑÑкÑÑÑа, и его
       главнÑм недоÑÑаÑком бÑло Ñо, ÑÑо вÑзÑваÑÑий
       должен бÑл ÑÑиÑÑваÑÑ Ð½Ð°Ð¿ÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑоÑÑа ÑÑека.

ÐÐ ÐÐÐÐ
       Ð ÑледÑÑÑем ÑегменÑе кода показано
       иÑполÑзование sigaltstack():

           stack_t ss;

           ss.ss_sp = malloc(SIGSTKSZ);
           if (ss.ss_sp == NULL)
               /* обÑабоÑка оÑибки */;
           ss.ss_size = SIGSTKSZ;
           ss.ss_flags = 0;
           if (sigaltstack(&ss, NULL) == -1)
               /* обÑабоÑка оÑибки */;

СÐÐТРÐТРТÐÐÐÐ
       execve(2), setrlimit(2), sigaction(2), siglongjmp(3), sigsetjmp(3),
       signal(7)



Linux                             2016-03-15                    SIGALTSTACK(2)