SIGSEGV
同期信号です。したがって、発信元のスレッドは、そのシグナル ハンドラでSIGSEGV
処理する対象となるスレッドです。SIGSEGV
この動作については、次のドキュメントに記載されています。
SIGSEGV
特定の機械語命令を実行した結果として生成されるやなどの特定のシグナルSIGFPE
は、特定のスレッドを対象とするシグナルと同様に、スレッド向けです。pthread_kill
私の知る限り、定義された動作を維持しながらシグナル ハンドラ内の特定のスレッドを終了する方法はありません。定義された動作を維持するために、シグナル ハンドラー内からは次の呼び出しのみを行うことができます。
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() execl() execle() execv() execve()
faccessat() fchmod() fchmodat() fchown() fchownat()
fcntl() fdatasync() fexecve() fork() fstat()
fstatat() fsync() ftruncate() futimens() getegid()
geteuid() getgid() getgroups() getpeername() getpgrp()
getpid() getppid() getsockname() getsockopt() getuid()
kill() link() linkat() listen() lseek()
lstat() mkdir() mkdirat() mkfifo() mkfifoat()
mknod() mknodat() open() openat() pause()
pipe() poll() posix_trace_event() pselect()
raise() read() readlink() readlinkat() recv()
recvfrom() recvmsg() rename() renameat() rmdir()
select() sem_post() send() sendmsg() sendto()
setgid() setpgid() setsid() setsockopt() setuid()
shutdown() sigaction() sigaddset() sigdelset() sigemptyset()
sigfillset() sigismember() signal() sigpause() sigpending()
sigprocmask() sigqueue() sigset() sigsuspend() sleep()
sockatmark() socket() socketpair() stat() symlink()
symlinkat() tcdrain() tcflow() tcflush() tcgetattr()
tcgetpgrp() tcsendbreak() tcsetattr() tcsetpgrp() time()
timer_getoverrun() timer_gettime() timer_settime()
times() umask() uname() unlink() unlinkat()
utime() utimensat() utimes() wait() waitpid()
write() _exit() _Exit()
定義された動作を取得するには、原因となっているコードをSEGSEGV
独自のプロセスに分離することを検討してください。たとえば、フォークして接続ごとにプロセスを使用するとSIGSEGV
、他の接続に影響を与えたり、未定義の動作を導入したりすることなく、エラーが発生したプロセスのみを強制終了できます。