我正在开发一个uni项目,它由某种多线程服务器组成...... 我注意到,在执行一个测试脚本时,程序正常结束,但是在返回指令处停留。
深入解释,我有一个主线程和其他几个线程。 当测试脚本结束时,它会向进程发送SIGQUIT信号。 我的一个线程捕获信号,解除分配一些东西并设置一个标志,告诉主线程开始清理,然后退出。
主线程通过在所有其他线程上执行pthread_join然后调用return 0来执行清理。
我在信号处理程序线程中的return语句之前和在main中的返回指令之前通过puttin检查了printf,并且都打印了,但是程序卡住了。
(请注意,对于主线程到达return语句,所有其他端线程必须已经终止,因为我等待每一个)
答案 0 :(得分:1)
我在信号处理程序线程
中的return语句之前通过puttin检查了printf
如果此“线程”是由signal()
或sigaction
之类的东西安装的实际信号处理函数,则无法安全地从信号处理程序中调用非异步信号安全函数。 See the POSIX standard了解信号的处理方式以及异步信号安全所需的功能列表:
上表中没有的任何功能可能不安全 信号。实现可以使其他接口异步信号安全。 在存在信号的情况下,由此卷定义的所有函数 POSIX.1-2008在调用或中断时应按行为定义 通过信号捕捉功能,除了当一个信号 中断不安全的功能或等效功能(如处理 相当于从初始调用返回后执行的exit() main())和信号捕获函数调用一个不安全的函数, 行为未定义。
进行此类调用的可能失败模式之一是停止进程的死锁。
例如,您的流程会直接或间接调用free()
或malloc()
或其中一个堂兄弟。这些功能都可能具有锁定功能,以保护内存分配数据免受同时修改和损坏。当保持该锁定时,线程被信号中断,然后您的信号处理程序进行需要已锁定锁定的调用。所以它在信号处理程序中阻塞,等待锁被释放。这将永远不会发生,因为持有锁的线程被阻止等待再次锁定。
死锁。
printf()
等功能通常会在内部使用malloc()
和free()
。
因此,如果该函数不在异步安全函数列表中,则无法通过信号处理程序调用它。期。
在Linux上,您需要将fork()
添加到不安全函数列表中,因为glibc实现不符合POSIX标准。
答案 1 :(得分:0)
问题是Ubuntu在进程终止时遇到了一些问题,我退出了一些在后台测试中遇到问题的进程,并且工作正常