C程序不会终止

时间:2017-08-24 22:15:17

标签: c multithreading process return

我正在开发一个uni项目,它由某种多线程服务器组成...... 我注意到,在执行一个测试脚本时,程序正常结束,但是在返回指令处停留。

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

主线程通过在所有其他线程上执行pthread_join然后调用return 0来执行清理。

我在信号处理程序线程中的return语句之前和在main中的返回指令之前通过puttin检查了printf,并且都打印了,但是程序卡住了。

(请注意,对于主线程到达return语句,所有其他端线程必须已经终止,因为我等待每一个)

2 个答案:

答案 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在进程终止时遇到了一些问题,我退出了一些在后台测试中遇到问题的进程,并且工作正常