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
只允许终止错误产生的进程,而不会影响其他连接或引入未定义的行为。