Pergunta

Non syscall wrappers mas algo como snprintf (), dprintf ()

Foi útil?

Solução 3

Finalmente últimas versões do man 7 signal-safety contém lista de interessados: sinal safety.7.html

Outras dicas

Tenho a certeza que você tem que ver o documentação

Editar : Como cerca de esta lista então?

De 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.

Isso parece difícil de determinar, como você não sabe qual a função inseguro aleatório uma rotina de biblioteca pode decidir chamar. A lista pode também diferente entre diferentes versões do glibc, ou se você levá-la para outro sistema Unix-like. Parece que você tem que analisar um monte de pilhas de chamadas para encontrar a resposta, e mesmo isso pode ser um pouco instável de versão para versão, distro para distro.

Talvez você não está olhando para o projeto abordagens alternativas, mas parece que a melhor estratégia seria: se o programa tem um ciclo de eventos, faça o manipulador de sinal muito estúpido e apenas definindo alguns afirmam que o ciclo de eventos vai pegar. Dessa forma, você fazer a parte externa do manipulador de sinal trabalho significativo.

Exemplo: Vamos dizer que você tem um lugar ciclo poll(). Talvez você poderia incluir um tubo que o manipulador de sinal pode escrever para. Em seguida, o loop poll() faz algum trabalho não trivial baseada em ser sinalizado por isso.

Eu preciso disso no manipulador SIGSEGV após acidente de aplicação.

Eu quero pilha relaxar na queda

Se você está tentando capturar um rastreamento de pilha:

  • Normalmente abort causaria um core dump, que pode ser executado através de um depurador para produzir o rastreamento de pilha.

  • Como alternativa, um bruto (mas de sinal-safe) maneira de fazer isso seria fork e exec um utilitário separado (por exemplo, "pstack") para a saída de um rastreamento de pilha de sua tarefa caiu. Quando-exec ing (após fork-ing, na criança), você vai precisar para passar o seu ID do processo utilizando getppid; e no pai você precisa wait que ela termine, antes de chamar abort.

Por outro lado, se você está tentando fazer uma saída "limpa" após SIGSEGV (por exemplo assegurando destruidores C ++ são chamados, etc.) - então você deve ser avisado de que POSIX diz:

http://pubs.opengroup.org/onlinepubs/9699919799/ funções / V2_chap02.html # tag_15_04_03_02 :

O comportamento de um processo é indefinido depois que ignora uma SIGFPE, SIGILL, sinal SIGSEGV, ou SIGBUS que não foi gerado por matança (), sigqueue () ou aumento ().

http://pubs.opengroup.org/onlinepubs/9699919799 /functions/V2_chap02.html#tag_15_04_03_03 :

O comportamento de um processo é indefinido após ele retorna normalmente de uma função de captura de sinal para uma SIGBUS, SIGFPE, SIGILL, ou SIGSEGV sinal que não foi gerado por matança (), sigqueue (), ou aumento ().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top