在为QNX交叉编译NTP时遇到了问题。我追查到了僵局。基本上会发生什么:
t0 - clock_select() calls realloc()
t1 - realloc() locks the heap
t2 - signal handler is called
t3 - inside sig handler recvmsg() is called
t4 - recvmsg() calls malloc()
t5 - malloc() tries to lock the heap
DEADLOCK
我想知道为什么Linux没有遇到这种死锁,结果是recvmsg()被认为是signal handler safe,而在QNX中,recvmsg()被明确列为not signal handler safe。
我的问题:我是否有办法在配置脚本中传递一个选项,以便在构建NTP时手动禁用已发出信号的I / O?我真的不想手动编辑源代码,以便更容易升级到未来版本的NTP。如果没有其他方法,我应该在生成的config.h脚本中禁用#defines以不使用信号I / O?
我希望找到一种方法来为NTP回购做出贡献,为QNX增加支持,但是现在这些人很难掌握。
谢谢大家的帮助和支持!
答案 0 :(得分:0)
我们通过提供关闭ntpd中的信号i / o解决了这个问题 以下config.cache值为configure脚本。
ntp_cv_hdr_def_sigio=${ntp_cv_hdr_def_sigio=no}
ntp_cv_hdr_def_sigpoll=${ntp_cv_hdr_def_sigpoll=no}