Ах, ужасный обработчик сигналов, использующий нереентерабельные функции.
Проблема в том, что специалисты по добавлению функций в *BSD ping
с самого начала делали ставку на безопасность.
FreeBSD добавила эту проблему в 1994 году, заметила ее в 1996 году и начала то, что должно было быть гораздо более коротким путем решения проблемы, чем оказалось, с окончательным исправлением где-то в 1998 году.
OpenBSD добавила эту проблему в 1997 году, заметила ее в 2002 году, но полностью упустила суть проблемы и не исправила ее должным образом и полностью до 2015 года.
NetBSD добавила эту проблему в 1996 г., но, как вы обнаружили, до сих пор не исправлена. NetBSD, вероятно, следует импортировать пинг OpenBSD.
Проблема в том, что ни malloc()
, ни какой-либо из STDIO (включая printf()
) не являются реентерабельными, что необходимо для всего кода, используемого в обработчике сигналов.
Есть десятки лучших мест, где можно найти описания повторного входа, проблем с обработчиками сигналов и т. д., но, возможно, этот вопрос и его принятый ответ (и некоторые связанные с ним вопросы) были бы хорошим началом:
Почему malloc() и printf() называются нереентерабельными?
person
Greg A. Woods
schedule
30.06.2016
triptime
является константой и в коде нет других FP (то естьtriptime*1000.0
было выполнено во время компиляции), некоторые компиляции оптимизируют подпрограммы FP, аprintf()
со спецификатором FP терпит неудачу - но это только предположение, поскольку контекста очень мало. здесь. - person chux - Reinstate Monica   schedule 24.06.2016