C++ C++;:如果发生segfault或类似的情况,有没有办法杀死单个线程,但保持应用程序运行?

C++ C++;:如果发生segfault或类似的情况,有没有办法杀死单个线程,但保持应用程序运行?,c++,multithreading,segmentation-fault,wt,C++,Multithreading,Segmentation Fault,Wt,这个主题或多或少地解释了这个问题。 我用C++和Wt.构建一个Web应用程序 当然,我试图特别小心可能导致segfault的事情,但它可能会发生。 Wt为每个打开会话的用户创建一个单独的线程。 特别是,我最担心的是,恶意用户发现一个bug,例如产生一个segfault,并设法利用它,使整个应用程序一时兴起而崩溃 相反,首选的行为是我可以“捕获”信号(是的,我知道segfault不是例外,这就是我使用引号的原因),杀死产生它的线程,如果可能的话,释放它分配的内存,然后让应用程序为其他用户运行 可能

这个主题或多或少地解释了这个问题。 我用C++和Wt.构建一个Web应用程序 当然,我试图特别小心可能导致segfault的事情,但它可能会发生。 Wt为每个打开会话的用户创建一个单独的线程。 特别是,我最担心的是,恶意用户发现一个bug,例如产生一个segfault,并设法利用它,使整个应用程序一时兴起而崩溃

相反,首选的行为是我可以“捕获”信号(是的,我知道segfault不是例外,这就是我使用引号的原因),杀死产生它的线程,如果可能的话,释放它分配的内存,然后让应用程序为其他用户运行

可能吗


谢谢

是可以为
SIGSEGV
编写处理程序。这样,您可以指定将发生什么

signal(SIGSEGV, sighandler); 

void sighandler(int signum)

{
    printf("Process %d got signal %d\n", getpid(), signum);
    kill(getpid(), signum);
}

有可能通过指定一个选项来回避这个问题。因此,您可以将每个会话分配给一个单独的进程,该进程将在segfault时崩溃,但不会影响其他会话


详细说明:Wt并不真正为每个会话创建一个线程,它使用一个线程池来安排工作。

这可能会有所帮助:在严重(灾难性)失败后,甚至不要试图让进程保持活动状态,让它早点死。不过,您可以将应用程序拆分为多个进程,以使关键故障保持在本地。@DieterLücking:谢谢。我知道,这远不是一个完美的解决方案,但我正试图达到我在php服务器中看到的相同行为,如果出现问题,用户将被踢出,但服务器仍在继续。在PHP服务器中,这似乎是错误发生的,C++中的错误是“编译器错误”,但是单一用户可以崩溃整个服务器的想法让我恼火不已。当应用程序只为1/10构建时,我是否应该将其移动到Java?这对解决这个具体问题有帮助吗?(迁移到Java会很痛苦……但如果值得的话,我可能会考虑一下)。@tkausl:谢谢,它澄清了在处理程序中可以做什么和不能做什么。但是,正如我在回复Shiro时所写的评论一样,我怀疑“信号”在多线程程序中根本不起作用。因此,即使一个
线程
出现错误,也有可能
虚拟内存
会损坏,等等。因此,如果存在程序/应用程序错误的危险,最好对每个
会话
使用
进程。我尝试了raise(SIGSEGV)和取消对空指针的引用。仅当信号由主进程生成时(例如在“main”函数中),才会调用处理程序。如果我尝试在线程调用的函数中执行相同的操作,则会忽略处理程序。具体地说,raise根本没有效果,取消空指针的FREENCE操作会在不调用处理程序的情况下使程序崩溃。可能与此相关:“未定义:在多线程程序中调用此函数会导致未定义的行为。”(来源:)这真的很有趣。我会调查的。谢谢!