【发布时间】:2015-05-25 16:21:22
【问题描述】:
我正在开发一个不时从数据库中读取的 POSIX 守护程序。 我想在 SIGTERM 到达时关闭连接(例如当系统关闭时)。
调用信号处理程序时,main() 是否暂停,直到处理程序完成其工作? 如果是这样并且处理程序调用了 exit(),main() 执行是否被中止(立即和原子地)? 如果不是这样,不处理 SIGTERM(来自连接的 POV)是一个“好主意”吗?
更新:为什么要暂停 main():比方说:
- SIGTERM 到达并调用信号处理程序。它关闭连接并释放其内存。
- 紧接着非暂停的 main() 表示是时候从数据库中获取数据了。
这将导致无效指针的取消引用(或至少在关闭连接上的操作中)。
【问题讨论】:
-
我不明白,为什么
main()会暂停?您需要处理信号,完成后,即关闭与数据库的连接,您调用exit()就是这样,为什么main()需要暂停? 你决定何时exit()该程序! -
main 就是你的程序开始运行的地方。如果您调用任何其他函数,则 main() 在该函数运行时“暂停”。包括信号处理程序...
-
您并不想从信号处理程序中调用
exit(),至少如果您想确保程序干净地关闭则不会。exit()不保证是异步信号保存。请改用_exit()。有关详细信息,请参阅man 7 signal。是的,处理信号的进程在处理信号期间会被中断。 -
@iharob 查看更新。
-
引用我之前的评论:将“process”替换为“thread”
标签: c database connection posix daemon