0

ソケット サーバー アプリケーションに boost asio を使用しています。各接続はブースト スレッドによって処理されます。コアごとに 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 ) 0x7ffff78cd58d で mysql_real_query() は 0x7ffff78cd5a9 で

4

1 に答える 1

0

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、他の接続に影響を与えたり、未定義の動作を導入したりすることなく、エラーが発生したプロセスのみを強制終了できます。

于 2013-03-20T15:31:28.553 に答える