Domanda

involucri non di syscall ma qualcosa di simile snprintf (), dprintf ()

È stato utile?

Soluzione 3

Infine ultime versioni di man 7 signal-safety contiene l'elenco interessati: segnale safety.7.html

Altri suggerimenti

Sono abbastanza sicuro che si deve vedere la documentazione

Modifica : Che ne dite di questa lista allora?

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

Questo sembra difficile da determinare, come non si sa che cosa casuale funzione non sicuro una routine di libreria potrebbe decidere di chiamare. L'elenco potrebbe anche diverso tra le diverse versioni di glibc, o se si prende ad un altro sistema Unix-like. Sembra che avrebbe dovuto analizzare un sacco di chiamate stack per trovare la risposta, e anche questo può essere un po 'traballante da versione a versione, distro a distro.

Forse non siete alla ricerca di approcci progettuali alternative, ma sembra una strategia migliore sarebbe: se il programma ha un ciclo di eventi, fare il gestore di segnale molto stupido e solo impostando alcuni affermano che il ciclo degli eventi pick up. In questo modo si fa il lavoro significativo al di fuori del gestore di segnale.

Esempio: Diciamo che hai un ciclo poll() da qualche parte. Forse si potrebbe includere un tubo che il gestore del segnale può scrivere a. Poi il ciclo poll() fa un lavoro non banale sulla base di essere segnalata da questo.

  

Ho bisogno di questo nel gestore SIGSEGV dopo schianto di applicazione.

     

Voglio rilassarsi pila su incidente

Se stai cercando di catturare una traccia dello stack:

  • Tipicamente abort causerebbe un core dump, che può essere eseguito tramite un debugger per produrre dello stack.

  • In alternativa, un grezzo (ma il segnale di sicurezza) modo di fare in modo sarebbe quello di fork e exec un programma separato (ad esempio "pstack") per l'uscita una traccia dello stack del vostro compito è schiantato. Quando exec-ing (dopo fork-ing, nel bambino), è necessario per passare il tuo ID di processo utilizzando getppid; e nel genitore è necessario wait che finisca, prima di chiamare abort.

D'altra parte, se si sta cercando di fare un uscita "pulita" dopo SIGSEGV (ad esempio garantendo distruttori C ++ vengono chiamati, ecc) - allora si dovrebbe essere avvertito che POSIX dice:

http://pubs.opengroup.org/onlinepubs/9699919799/ funzioni / V2_chap02.html # tag_15_04_03_02 :

  

Il comportamento di un processo è indefinito dopo che ignora un SIGFPE,   SIGILL, il segnale SIGSEGV, o SIGBUS che non è stato generato da kill (),   sigqueue (), o rilanciare ().

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

  

Il comportamento di un processo è indefinito dopo ritorna normalmente da   un segnale di catching-funzione per un SIGBUS, SIGFPE, SIGILL, o SIGSEGV   il segnale che non è stato generato da kill (), sigqueue (), o rilanciare ().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top