0

我正在为我的套接字服务器应用程序使用 boost asio。每个连接都由一个 boost 线程处理。我在每个核心使用 io_service,每个 io_service 在一个工作线程中运行。

在我的连接中,我使用 mysql C apis 来查询数据库。当流量很高时,有时 mysql_query/close api 会执行 SIGSEGV。

有没有办法处理每个线程的 SIGSEGV,以便我的线程调用执行 SIGSEGV 的 mysql api,只处理其他线程不受影响的异常。

这是我收到的错误 Thread [17] 2844 [core: 0] (Suspended : Signal : SIGSEGV:Segmentation fault) 0x0 net_real_write() at 0x7ffff78d1ae5 net_flush() at 0x7ffff78d201b net_write_command() at 0x7ffff78d21d0 cli_advanced_command() at 0x7ffff78d1ae5 net_write_command() at 0x7ffff78d21d0 cli_advanced_command() mysql_send ) 在 0x7ffff78cd58d mysql_real_query() 在 0x7ffff78cd5a9

4

1 回答 1

0

SIGSEGV是同步信号。因此,SIGSEGV发起的线程是将SIGSEGV在其信号处理程序中处理的目标线程。此处记录了此行为:

由于执行特定机器语言指令而生成的某些信号(例如SIGSEGVSIGFPE)是线程导向的,针对特定线程的信号也是如此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只允许终止错误产生的进程,而不会影响其他连接或引入未定义的行为。

于 2013-03-20T15:31:28.553 回答