Функция memcpy() реентерабельна?
Я вызываю некоторые функции C++ внутри обработчика сигнала, и моя программа завершается из-за ошибки сегментации. Когда я проверяю с GDB, функция memcpy(), где я получаю SIGSEGV. Я хотел бы знать, является ли memcpy() реентерабельной функцией или нет?
5 ответов
На всех платформах, кроме самых встраиваемых, она будет реентерабельной. Вы упоминаете SIGSEGV, поэтому я предполагаю, что это не один из них. В этом случае, скорее всего, memcpy() не виновник: это ошибка вызывающего. Если вы попросите memcpy() скопировать плохие указатели (или неправильную длину), то это будет ошибка. Вы можете легко сделать это:
memcpy(NULL, NULL, 123456789);
Это вызовет SIGSEGV, и он скажет вам, что memcpy() вызвал его. Конечно, это не вина Memcpy - он просто делает то, что вы сказали. Ваш обработчик сигнала называет это чем-то странным. Обратный след (в gdb или любом другом инструменте, который у вас есть) на сайте вызывающей стороны должен показать, как вы его назвали. В противном случае просто распечатайте аргументы, передаваемые в memcpy.
Некоторая соответствующая информация, касающаяся (не) реентерабельных функций и обработчиков сигналов (в той степени, в которой они относятся к библиотеке GNU C), может быть найдена по адресу http://www.gnu.org/s/libc/manual/html_node/Nonreentrancy.html.:
Эта часть кажется особенно актуальной для вашего вопроса:
"Простое чтение из объекта памяти безопасно при условии, что вы можете иметь дело с любыми значениями, которые могут появиться в объекте в тот момент, когда сигнал может быть доставлен. Имейте в виду, что для присвоения некоторых типов данных требуется более одной инструкции, это означает, что обработчик может выполнить "в середине" присваивания переменной, если ее тип не является атомарным ".
"Простая запись в объект памяти безопасна до тех пор, пока внезапное изменение значения в любой момент, когда может работать обработчик, ничего не изменит".
Я не понимаю, почему он не может быть повторно входящим. Я не уверен, но я думаю, что многое зависит от библиотек, которые вы используете.
Я думаю, что проблема в том, что вы используете в качестве параметров для функции memcpy недопустимый (или удаленный) указатель, пожалуйста, внимательно проверьте ваш код.
С уважением.
Если не memcpy
ПЛОХО реализован, он реентерабелен. Он будет работать только с тем, что вы ему дадите - указатели и значение длины. Все параметры передаются по значению, поэтому после активации функции эти значения не изменятся в кадре стека независимо от сигналов и / или других потоков.