glibc からの非同期シグナルセーフ関数のリストが必要です
-
19-09-2019 - |
質問
syscall のラッパーではないが、snprintf()、dprintf() のようなもの
解決 3
最後に最新のバージョン man 7 signal-safety
を含む興味の一覧: signal-safety.7.html
他のヒント
必ず見るべきだと思います ドキュメンテーション
編集:どうでしょうか このリスト それから?
から 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.
これは、ライブラリルーチンが呼び出しすることにしたかもしれないものにランダムに危険な機能がわからないよう、決定するのは難しいようです。リストには、glibcの異なるバージョン間で異なる可能性があります、またはあなたは他のUnixライクなシステムにそれを取る場合。あなたは、コールの多くは答えを見つけるためにスタック、さらにそれは、ディストリビューションへのディストリビューションのバージョンにバージョンから少し不安定かもしれ分析する必要があると思いますように思えます。
たぶん、あなたは別の設計アプローチを探していませんが、それは次のようになり、より良い戦略のように思える:プログラムがイベントループを持っている場合、シグナルハンドラは非常に愚かにし、ちょうどイベントループをピックアップすることにいくつかの状態を設定します。そのように、あなたは、シグナルハンドラの外で意味のある仕事をしています。
例:あなたはどこかpoll()
ループを持っているとしましょう。たぶん、あなたは、シグナルハンドラがに書き込むことができ、パイプを含むこともできます。そして、poll()
ループはそのによって通知されているに基づいていくつかの非自明な作業を行います。
が必要ですSIGSEGVハンドラの後、クラッシュです。
したいほっこりスタックにクラッシュ
いうチャームスタックトレース:
通常、
abort
がコアダンプできる走りを通してデバッガのスタックトレース.また、原油が信号を安全に)そうした期待に応えることができる
fork
やexec
別の変換ユーティリティ(例えば"pstack")を出力スタックトレースのお話です。時exec
グ後fork
-ingの子どもだその場合には、プロセスIDを使用getppid
;の親る必要がありまwait
で仕上がりを呼び出す前に、abort
.
一方、ねばい"クリーン"出口より後SIGSEGV例確C++destructorsになると呼ばれる等) --それがることを警告されPOSIX"と言ってい
http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04_03_02:
行動のプロセスが未定義ので無視しSIGFPE, SIGILL,SIGSEGV、SIGBUS信号が発生しないよkill(), sigqueue()、または識().
や http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04_03_03:
行動のプロセスが未定義の後を返します通常から 信号をキャッチ機能SIGBUS,SIGFPE,SIGILL、SIGSEGV 信号が発生しないよkill(),sigqueue()、または識().