signal-safety

SIGNAL-SAFETY(7)Ð ÑководÑÑво пÑогÑаммиÑÑа LinuxSIGNAL-SAFETY(7)



ÐÐЯ
       signal-safety - ÑÑнкÑии async-signal-safe

ÐÐÐСÐÐÐÐ
       ФÑнкÑией async-signal-safe назÑваеÑÑÑ ÑÑнкÑиÑ,
       коÑоÑÑÑ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñно вÑзÑваÑÑ Ð²Ð½ÑÑÑи обÑабоÑÑика
       Ñигналов. Ðногие ÑÑнкÑии не ÑвлÑÑÑÑÑ
       async-signal-safe. Ð ÑаÑÑноÑÑи, неÑеенÑеÑабелÑнÑе
       ÑÑнкÑии, обÑÑно, небезопаÑно вÑзÑваÑÑ Ð²
       обÑабоÑÑÐ¸ÐºÐ°Ñ Ñигналов.

       ÐÐ¸Ð´Ñ Ð¿Ñоблем, коÑоÑÑе делаÑÑ ÑÑнкÑиÑ
       небезопаÑной, можно бÑÑÑÑо понÑÑÑ Ð½Ð°
       пÑимеÑе ÑеализаÑии библиоÑеки stdio, вÑе
       ÑÑнкÑии коÑоÑой ÑвлÑÑÑÑÑ Ð½Ðµ async-signal-safe.

       ÐÑи вÑполнении бÑÑеÑизиÑÑемого
       ввода-вÑвода в Ñайл ÑÑнкÑии stdio должнÑ
       веÑÑи ÑÑаÑиÑеÑки вÑделеннÑй бÑÑÐµÑ Ð¸ ÑвÑзаннÑе
       Ñ Ð½Ð¸Ð¼ ÑÑÑÑÑики и индекÑÑ (или ÑказаÑели),
       ÑодеÑжаÑие колиÑеÑÑво даннÑÑ Ð¸ ÑекÑÑее
       положение в бÑÑеÑе. ÐÑедположим, ÑÑо
       оÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð¿ÑогÑамма наÑодиÑÑÑ Ð² ÑеÑедине
       вÑзова ÑÑнкÑии stdio, напÑÐ¸Ð¼ÐµÑ printf(3), коÑоÑаÑ
       обновлÑÐµÑ ÑаÑÑÑ Ð±ÑÑеÑа и ÑвÑзаннÑÑ Ð¿ÐµÑеменнÑÑ.
       ÐÑли в ÑÑÐ¾Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¿ÑогÑамма пÑеÑвÑÑÑÑ
       обÑабоÑÑиком Ñигнала, коÑоÑÑй Ñакже
       вÑзÑÐ²Ð°ÐµÑ printf(3), Ñо вÑоÑой вÑзов printf(3) бÑдеÑ
       ÑабоÑаÑÑ Ñ Ð½Ðµ ÑелоÑÑнÑми даннÑми и ÑезÑлÑÑаÑ
       бÑÐ´ÐµÑ Ð½ÐµÐ¿ÑедÑказÑем.

       ЧÑÐ¾Ð±Ñ Ð½Ðµ возникало пÑоблем Ñ
       небезопаÑнÑми ÑÑнкÑиÑми еÑÑÑ Ð´Ð²Ð° ваÑианÑа:

       1. СледиÑÑ, ÑÑÐ¾Ð±Ñ (а) обÑабоÑÑик Ñигнала
          вÑзÑвал ÑолÑко ÑÑнкÑии async-signal-safe, и (б) Ñам
          обÑабоÑÑик Ñигнала бÑл ÑеенÑеÑабелÑнÑм по
          оÑноÑÐµÐ½Ð¸Ñ Ðº глобалÑнÑм пеÑеменнÑм
          оÑновной пÑогÑаммÑ.

       2. ÐлокиÑоваÑÑ Ð´Ð¾ÑÑÐ°Ð²ÐºÑ Ñигнала в оÑновной
          пÑогÑамме пÑи вÑзове небезопаÑнÑÑ ÑÑнкÑий
          или пÑи ÑабоÑе Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑми даннÑми,
          доÑÑÑпнÑми из обÑабоÑÑика Ñигнала.

       ÐбÑÑно, вÑоÑой ваÑÐ¸Ð°Ð½Ñ ÑÑÑден Ð´Ð»Ñ Ð¿ÑогÑамм
       лÑбой ÑложноÑÑи, поÑÑÐ¾Ð¼Ñ Ð¸ÑполÑзÑеÑÑÑ Ð¿ÐµÑвÑй
       ваÑианÑ.

       Ð POSIX.1 опÑеделÑн Ð½Ð°Ð±Ð¾Ñ ÑÑнкÑий, ÑеализаÑиÑ
       коÑоÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð° бÑÑÑ async-signal-safe (ÑеализаÑиÑ
       Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедоÑÑавлÑÑÑ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑнÑÑ ÑеализаÑÐ¸Ñ Ð¸
       дÑÑÐ³Ð¸Ñ ÑÑнкÑий, но ÑÑо не ÑÑебÑеÑÑÑ ÑÑандаÑÑом и
       дÑÑгие ÑеализаÑии могÑÑ Ð½Ðµ пÑедоÑÑавлÑÑÑ Ñе
       же гаÑанÑии) ÐбÑÑно, ÑÑнкÑÐ¸Ñ ÑвлÑеÑÑÑ
       async-signal-safe или поÑÐ¾Ð¼Ñ ÑÑо она
       ÑеенÑеÑабелÑнаÑ, или из-за ÐµÑ Ð°ÑомаÑноÑÑи по
       оÑноÑÐµÐ½Ð¸Ñ Ðº Ñигналам (Ñ. е., ÐµÑ Ð²Ñполнение
       не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑеÑвано обÑабоÑÑиком
       Ñигнала).

       ÐÐ°Ð±Ð¾Ñ ÑÑнкÑий async-signal-safe по POSIX.1 показан в
       ÑаблиÑе далее. ФÑнкÑии, еÑли не Ñказано
       обÑаÑное, ÑвлÑÑÑÑÑ async-signal-safe и по POSIX.1-2001; в
       ÑаблиÑе оÑмеÑÐµÐ½Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² поÑледÑÑÑиÑ
       ÑÑандаÑÑаÑ.

       ÑÑнкÑÐ¸Ñ             ÐÑимеÑаниÑ
       abort(3)               Ðобавлена в POSIX.1-2003
       accept(2)
       access(2)
       aio_error(3)
       aio_return(3)
       aio_suspend(3)         СмоÑÑиÑе замеÑÐ°Ð½Ð¸Ñ Ð´Ð°Ð»ÐµÐµ
       alarm(2)
       bind(2)
       cfgetispeed(3)
       cfgetospeed(3)
       cfsetispeed(3)
       cfsetospeed(3)
       chdir(2)
       chmod(2)
       chown(2)
       clock_gettime(2)
       close(2)
       connect(2)
       creat(2)
       dup(2)
       dup2(2)
       execl(3)               Ðобавлена в POSIX.1-2008; ÑмоÑÑиÑе замеÑÐ°Ð½Ð¸Ñ Ð½Ð¸Ð¶Ðµ
       execle(3)              СмоÑÑиÑе замеÑÐ°Ð½Ð¸Ñ Ð´Ð°Ð»ÐµÐµ
       execv(3)               Ðобавлена в POSIX.1-2008
       execve(2)
       _exit(2)
       _Exit(2)
       faccessat(2)           Ðобавлена в POSIX.1-2008
       fchdir(2)              Ðобавлена в POSIX.1-2013
       fchmod(2)
       fchmodat(2)            Ðобавлена в POSIX.1-2008
       fchown(2)
       fchownat(2)            Ðобавлена в POSIX.1-2008
       fcntl(2)
       fdatasync(2)
       fexecve(3)             Ðобавлена в POSIX.1-2008
       ffs(3)                 Ðобавлена в POSIX.1-2016
       fork(2)                СмоÑÑиÑе замеÑÐ°Ð½Ð¸Ñ Ð´Ð°Ð»ÐµÐµ
       fstat(2)
       fstatat(2)             Ðобавлена в POSIX.1-2008
       fsync(2)
       ftruncate(2)
       futimens(3)            Ðобавлена в POSIX.1-2008
       getegid(2)
       geteuid(2)
       getgid(2)
       getgroups(2)
       getpeername(2)
       getpgrp(2)
       getpid(2)
       getppid(2)
       getsockname(2)
       getsockopt(2)
       getuid(2)
       htonl(3)               Ðобавлена в POSIX.1-2016
       htons(3)               Ðобавлена в POSIX.1-2016
       kill(2)
       link(2)
       linkat(2)              Ðобавлена в POSIX.1-2008

       listen(2)
       longjmp(3)             Ðобавлена в POSIX.1-2016; ÑмоÑÑиÑе замеÑÐ°Ð½Ð¸Ñ Ð½Ð¸Ð¶Ðµ
       lseek(2)
       lstat(2)
       memccpy(3)             Ðобавлена в POSIX.1-2016
       memchr(3)              Ðобавлена в POSIX.1-2016
       memcmp(3)              Ðобавлена в POSIX.1-2016
       memcpy(3)              Ðобавлена в POSIX.1-2016
       memmove(3)             Ðобавлена в POSIX.1-2016
       memset(3)              Ðобавлена в POSIX.1-2016
       mkdir(2)
       mkdirat(2)             Ðобавлена в POSIX.1-2008
       mkfifo(3)
       mkfifoat(3)            Ðобавлена в POSIX.1-2008
       mknod(2)               Ðобавлена в POSIX.1-2008
       mknodat(2)             Ðобавлена в POSIX.1-2008
       ntohl(3)               Ðобавлена в POSIX.1-2016
       ntohs(3)               Ðобавлена в POSIX.1-2016
       open(2)
       openat(2)              Ðобавлена в POSIX.1-2008
       pause(2)
       pipe(2)
       poll(2)
       posix_trace_event(3)
       pselect(2)
       pthread_kill(3)        Ðобавлена в POSIX.1-2013
       pthread_self(3)        Ðобавлена в POSIX.1-2013
       pthread_sigmask(3)     Ðобавлена в POSIX.1-2013
       raise(3)
       read(2)
       readlink(2)
       readlinkat(2)          Ðобавлена в POSIX.1-2008
       recv(2)
       recvfrom(2)
       recvmsg(2)
       rename(2)
       renameat(2)            Ðобавлена в POSIX.1-2008
       rmdir(2)
       select(2)
       sem_post(3)
       send(2)
       sendmsg(2)
       sendto(2)
       setgid(2)
       setpgid(2)
       setsid(2)
       setsockopt(2)
       setuid(2)
       shutdown(2)
       sigaction(2)
       sigaddset(3)
       sigdelset(3)
       sigemptyset(3)
       sigfillset(3)
       sigismember(3)
       siglongjmp(3)          Ðобавлена в POSIX.1-2016; ÑмоÑÑиÑе замеÑÐ°Ð½Ð¸Ñ Ð½Ð¸Ð¶Ðµ
       signal(2)
       sigpause(3)
       sigpending(2)
       sigprocmask(2)
       sigqueue(2)
       sigset(3)
       sigsuspend(2)
       sleep(3)
       sockatmark(3)          Ðобавлена в POSIX.1-2004

       socket(2)
       socketpair(2)
       stat(2)
       stpcpy(3)              Ðобавлена в POSIX.1-2016
       stpncpy(3)             Ðобавлена в POSIX.1-2016
       strcat(3)              Ðобавлена в POSIX.1-2016
       strchr(3)              Ðобавлена в POSIX.1-2016
       strcmp(3)              Ðобавлена в POSIX.1-2016
       strcpy(3)              Ðобавлена в POSIX.1-2016
       strcspn(3)             Ðобавлена в POSIX.1-2016
       strlen(3)              Ðобавлена в POSIX.1-2016
       strncat(3)             Ðобавлена в POSIX.1-2016
       strncmp(3)             Ðобавлена в POSIX.1-2016
       strncpy(3)             Ðобавлена в POSIX.1-2016
       strnlen(3)             Ðобавлена в POSIX.1-2016
       strpbrk(3)             Ðобавлена в POSIX.1-2016
       strrchr(3)             Ðобавлена в POSIX.1-2016
       strspn(3)              Ðобавлена в POSIX.1-2016
       strstr(3)              Ðобавлена в POSIX.1-2016
       strtok_r(3)            Ðобавлена в POSIX.1-2016
       symlink(2)
       symlinkat(2)           Ðобавлена в POSIX.1-2008
       tcdrain(3)
       tcflow(3)
       tcflush(3)
       tcgetattr(3)
       tcgetpgrp(3)
       tcsendbreak(3)
       tcsetattr(3)
       tcsetpgrp(3)
       time(2)
       timer_getoverrun(2)
       timer_gettime(2)
       timer_settime(2)
       times(2)
       umask(2)
       uname(2)
       unlink(2)
       unlinkat(2)            Ðобавлена в POSIX.1-2008
       utime(2)
       utimensat(2)           Ðобавлена в POSIX.1-2008
       utimes(2)              Ðобавлена в POSIX.1-2008
       wait(2)
       waitpid(2)
       wcpcpy(3)              Ðобавлена в POSIX.1-2016
       wcpncpy(3)             Ðобавлена в POSIX.1-2016
       wcscat(3)              Ðобавлена в POSIX.1-2016
       wcschr(3)              Ðобавлена в POSIX.1-2016
       wcscmp(3)              Ðобавлена в POSIX.1-2016
       wcscpy(3)              Ðобавлена в POSIX.1-2016
       wcscspn(3)             Ðобавлена в POSIX.1-2016
       wcslen(3)              Ðобавлена в POSIX.1-2016
       wcsncat(3)             Ðобавлена в POSIX.1-2016
       wcsncmp(3)             Ðобавлена в POSIX.1-2016
       wcsncpy(3)             Ðобавлена в POSIX.1-2016
       wcsnlen(3)             Ðобавлена в POSIX.1-2016
       wcspbrk(3)             Ðобавлена в POSIX.1-2016
       wcsrchr(3)             Ðобавлена в POSIX.1-2016
       wcsspn(3)              Ðобавлена в POSIX.1-2016
       wcsstr(3)              Ðобавлена в POSIX.1-2016
       wcstok(3)              Ðобавлена в POSIX.1-2016
       wmemchr(3)             Ðобавлена в POSIX.1-2016
       wmemcmp(3)             Ðобавлена в POSIX.1-2016
       wmemcpy(3)             Ðобавлена в POSIX.1-2016
       wmemmove(3)            Ðобавлена в POSIX.1-2016

       wmemset(3)             Ðобавлена в POSIX.1-2016
       write(2)

       ÐамеÑаниÑ:

       *  Ð POSIX.1-2001 и POSIX.1-2004 ÑÑебÑеÑÑÑ, ÑÑÐ¾Ð±Ñ ÑÑнкÑии
          fpathconf(3), pathconf(3) и sysconf(3) бÑли async-signal-safe,
          но ÑÑо ÑÑебование Ñдалено в POSIX.1-2008.

       *  ÐÑли обÑабоÑÑик Ñигнала пÑеÑÑваеÑ
          вÑполнение небезопаÑной ÑÑнкÑии и
          обÑабоÑÑик завеÑÑаеÑÑÑ Ð²Ñзовом longjmp(3) или
          siglongjmp(3) и далее пÑогÑамма вÑзÑваеÑ
          небезопаÑнÑÑ ÑÑнкÑиÑ, Ñо поведение
          пÑогÑÐ°Ð¼Ð¼Ñ Ð½ÐµÐ¿ÑедÑказÑемо.

       *  Ð POSIX.1-2003 ÑÑоÑнено, ÑÑо еÑли пÑиложение
          вÑзÑÐ²Ð°ÐµÑ fork(2) из обÑабоÑÑика Ñигнала и и
          заÑегиÑÑÑиÑованнÑй обÑабоÑÑик fork (Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
          pthread_atfork(3)) вÑзÑÐ²Ð°ÐµÑ Ð½Ðµ async-signal-safe ÑÑнкÑиÑ,
          Ñо поведение непÑедÑказÑемо. ÐеÑоÑÑно, в
          бÑдÑÑÐ¸Ñ Ð²ÐµÑÑиÑÑ ÑÑандаÑÑа вÑзов fork(2) бÑдеÑ
          ÑдалÑн из ÑпиÑка ÑÑнкÑий async-signal-safe.

   ÐÑÐºÐ»Ð¾Ð½ÐµÐ½Ð¸Ñ Ð² библиоÑеке GNU C
       РбиблиоÑеке GNU C еÑÑÑ ÑледÑÑÑие извеÑÑнÑе
       оÑÐºÐ»Ð¾Ð½ÐµÐ½Ð¸Ñ Ð¾Ñ ÑÑандаÑÑа:

       *  Ðо glibc 2.24 внÑÑÑи execl(3) и execle(3)
          иÑполÑзовалаÑÑ realloc(3) и поÑÑÐ¾Ð¼Ñ Ð¾Ð½Ð¸ бÑли
          не безопаÑÐ½Ñ Ð´Ð»Ñ Ð°ÑинÑÑоннÑÑ Ñигналов. ÐÑо
          бÑло иÑпÑавлено в glibc 2.24.

       *  РеализаÑÐ¸Ñ aio_suspend(3) в glibc не ÑвлÑеÑÑÑ
          безопаÑной Ð´Ð»Ñ Ð°ÑинÑÑоннÑÑ Ñигналов, Ñак
          как в ней иÑполÑзÑеÑÑÑ pthread_mutex_lock(3).

СÐÐТРÐТРТÐÐÐÐ
       sigaction(2), signal(7), standards(7)



Linux                             2017-03-13                  SIGNAL-SAFETY(7)