Eu preciso de uma lista de funções Async-Signal-Safe de glibc
-
19-09-2019 - |
Pergunta
Non syscall wrappers mas algo como snprintf (), dprintf ()
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
eexec
um utilitário separado (por exemplo, "pstack") para a saída de um rastreamento de pilha de sua tarefa caiu. Quando-exec
ing (apósfork
-ing, na criança), você vai precisar para passar o seu ID do processo utilizandogetppid
; e no pai você precisawait
que ela termine, antes de chamarabort
.
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 ().