Мне нужен список Функций Async-Signal-Safe от glibc

Не обертки syscall, но что-то как snprintf (), dprintf ()

13
задан vitaly.v.ch 6 January 2010 в 13:29
поделиться

2 ответа

Это кажется трудно определить, так как вы не знаете, какая случайная небезопасная функция, которую может решить библиотечную рутину. Список также может отличаться между различными версиями GLIBC, или если вы возьмете его на другую систему Unix. Похоже, вам придется проанализировать множество стеков для вызовов, чтобы найти ответ, и даже это может быть немного шаткой из версии для версии, дистрибутив на дистрибуцию.

Может быть, вы не ищете альтернативные подходы к дизайну, но кажется, что она будет лучшей стратегией: если ваша программа имеет петлю события, сделайте обработчик сигнала очень глупым и просто устанавливающую состояние, что цикл события заберет. Таким образом, вы делаете значимую работу за пределами обработчика сигнала.

Пример: скажем, вы получили опрос () петля где-то. Может быть, вы можете включить трубу, чтобы обработчик сигнала может писать. Тогда Poll () Poll () цикла () цикла работает некоторая нетривиальная работа, основанная на сигнализации.

1
ответ дан 1 December 2019 в 23:47
поделиться

Я уверен, что вы должны увидеть документацию

Edit : Как насчёт этого списка ?

Из man signal:

NOTES

   The effects of this call in a multi-threaded process are unspecified.


   The routine handler must be very careful,  since  processing  elsewhere
   was interrupted at some arbitrary point. POSIX has the concept of "safe
   function".  If a signal interrupts  an  unsafe  function,  and  handler
   calls  an  unsafe  function, then the behavior is undefined. Safe func-
   tions are listed explicitly in the various standards.  The POSIX.1-2003
   list is

   _Exit()  _exit()  abort()  accept()  access()  aio_error() aio_return()
   aio_suspend() alarm() bind() cfgetispeed() cfgetospeed()  cfsetispeed()
   cfsetospeed() chdir() chmod() chown() clock_gettime() close() connect()
   creat() dup() dup2() execle() execve() fchmod() fchown() fcntl() fdata-
   sync()   fork()   fpathconf()  fstat()  fsync()  ftruncate()  getegid()
   geteuid() getgid() getgroups() getpeername() getpgrp()  getpid()  getp-
   pid()   getsockname()  getsockopt()  getuid()  kill()  link()  listen()
   lseek() lstat()  mkdir()  mkfifo()  open()  pathconf()  pause()  pipe()
   poll()  posix_trace_event()  pselect() raise() read() readlink() recv()
   recvfrom()  recvmsg()  rename()  rmdir()  select()  sem_post()   send()
   sendmsg()  sendto()  setgid()  setpgid() setsid() setsockopt() setuid()
   shutdown()  sigaction()  sigaddset()  sigdelset()  sigemptyset()   sig-
   fillset()  sigismember() signal() sigpause() sigpending() sigprocmask()
   sigqueue() sigset() sigsuspend() sleep() socket()  socketpair()  stat()
   symlink()  sysconf()  tcdrain()  tcflow() tcflush() tcgetattr() tcgetp-
   grp() tcsendbreak() tcsetattr() tcsetpgrp()  time()  timer_getoverrun()
   timer_gettime()   timer_settime()   times()  umask()  uname()  unlink()
   utime() wait() waitpid() write().

   According to POSIX, the behaviour of a process is  undefined  after  it
   ignores  a  SIGFPE, SIGILL, or SIGSEGV signal that was not generated by
   the kill(2) or the raise(3) functions.  Integer division  by  zero  has
   undefined result.  On some architectures it will generate a SIGFPE sig-
   nal.  (Also dividing the most  negative  integer  by  -1  may  generate
   SIGFPE.)  Ignoring this signal might lead to an endless loop.

   See  sigaction(2)  for  details  on what happens when SIGCHLD is set to
   SIG_IGN.

   The use of sighandler_t is a GNU extension.  Various versions  of  libc
   predefine  this  type;  libc4  and  libc5  define  SignalHandler, glibc
   defines sig_t and, when _GNU_SOURCE is defined, also sighandler_t.
15
ответ дан 1 December 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: