C程序不会终止

C程序不会终止

问题描述:

我正在研究一个uni项目,它由一些多线程服务器组成...... 我注意到,当执行一个测试脚本时,程序通常会达到它的结束状态,但是会卡住在返回指令。C程序不会终止

更深入地解释,我得到了一个主线程和其他几个线程。 当测试脚本结束时,它发送一个SIGQUIT信号给进程。 我的一个线程捕获信号,释放一些东西并设置一个标志,告诉主线程开始清理,然后退出。

主线程做的所有其他线程在pthread_join执行清理,然后调用返回0

我检查通过在信号处理器线程,并在返回指令前return语句之前puttin一个printf主,并且都被打印,但程序卡住了。

(注意,主线程到达return语句,所有对方线程必须终止,我在等待每个那些)

+0

欢迎堆栈溢出。请(重新)阅读[关于]和[问]页面。更迫切的是,除非你向我们展示代码 - 我们需要一个MCVE([MCVE])能够提供帮助,否则我们没有什么能够做的,除非把这个问题搁置。有无穷无尽的事情可能会让你的程序无穷无尽;没有代码,我们不能开始猜测你是多么的有创造力和聪明。 –

+0

嗯,我真的不知道要放哪个代码,因为它是7000多行非常复杂的代码... 任何机会,这个问题修复自己,我不知道如何,但重试几次后它刚开始工作正常,我想这是一个操作系统的问题,然后 – NokiStrawby

+0

而我们的目的是猜测你有7000多行代码错误。这就是MC(最小)中的M来的地方。你必须处理你的代码,保持它的工作(或者说,相同的方式失败),同时消除无关的东西。另见SSCCE([Simple,Self-Contained,Complete/Compilable Example](http://sscce.org/))。 –

我检查由return语句之前puttin一个printf在信号处理器线程

如果这个“线程”是有点像signal()sigaction安装了实际的信号处理函数,你不能安全地从信号处理程序中就非异步信号安全函数的调用。 See the POSIX standard对信号的处理方式和所需要的是异步信号安全保护功能列表:

未在上表中的任何功能可能是不安全的相对于 信号。实现可能使其他接口异步信号安全。 在存在信号的情况下,由该体积定义的所有功能应当如通过信号捕捉功能调用或中断 时那样定义,除了当信号 中断不安全功能或相当于(如从初始调用返回到 main()时执行的等效于exit()的处理 ,并且信号捕获函数调用不安全函数,则 行为是未定义的。

进行此类调用的可能失败模式之一是会阻止您的进程的死锁。

会发生什么情况,例如,您的过程直接或间接调用free()malloc()或其一个表亲。这些函数可能都有锁定来保护内存分配数据免受同时修改和损坏。当锁被保持时,线程被信号中断,然后你的信号处理程序发出一个呼叫,要求已经锁定的锁。所以它在信号处理程序中阻塞,等待锁被释放。永远不会发生这种情况,因为持有锁的线程是同一个锁,等待再次获取锁。

死锁。

而功能例如printf()经常在内部使用malloc()free()

因此,如果该函数不在异步安全函数列表中,则无法从信号处理程序调用它。期。

而在Linux上,您需要将fork()添加到不安全函数列表中,因为glibc实现不符合POSIX标准。

+0

对于为什么POSIX不认为'strlen()'和相关的函数是(或者应该)是线程安全的吗? –

+0

不是这样的,我没有使用sigaction,我使用单独的线程来处理信号,并且我这样做是为了能够使用非异步安全功能... 这不是死锁无论如何,我计划每个交互与共享对象,以便锁遵循严格的顺序和共享对象不能被free'd使用时。 这个问题实际上是Ubuntu在进程中做了一些奇怪的事情,我注意到有一个过程仍然从之前运行,出于某种原因,并且killall试图退出那个而不是它的意图... – NokiStrawby

+0

@JonathanLeffler * Do你对于为什么POSIX不认为'strlen()'和相关的函数是(或者应该)是线程安全的?现在,你迫使我考虑它;-),但是,我想这是一个避免实现细节和/或闪烁的组合,同时还有更重要的事情要花费有限的周期,尤其是如果你需要一个已知的异步信号安全的'strlen()'或类似的,你可以在几分钟内编写你自己的。 –

问题是Ubuntu的有一些问题的进程终止,我不干了一些过程这是从背景前面的测试卡,和它的工作