Я тестирую код, предназначенный для обнаружения, когда дочерний процесс вышел из строя. Вообразите меня удивленным, когда этот код не всегда segfault:
#include <stdio.h>
int main() {
char *p = (char *)(unsigned long)0;
putchar(*p);
return 0;
}
Я работаю под ядром Debian Linux 2.6.26; моя оболочка - AT & T ksh93
из пакета Debian ksh
, версия M 93s + 2008-01-31. Иногда эта программа segfault, но в противном случае она просто молча завершается с ненулевым состоянием выхода, но без сообщения. Моя программа обнаружения сигналов сообщает следующее:
segfault terminated by signal 11: Segmentation fault
segfault terminated by signal 53: Real-time signal 19
segfault terminated by signal 11: Segmentation fault
segfault terminated by signal 53: Real-time signal 19
segfault terminated by signal 53: Real-time signal 19
segfault terminated by signal 53: Real-time signal 19
segfault terminated by signal 53: Real-time signal 19
Запуск под чистым ksh
показывает, что segfault также встречается редко:
Running...
Running...
Running...
Running...
Running...
Running... Memory fault
Running...
Интересно, что bash
правильно определяет segfault каждый раз .
У меня есть два вопроса:
Кто-нибудь может объяснить это поведение?
Кто-нибудь может предложить простую программу на C, которая будет надежно работать с segfault при каждом выполнении? Я также пытался kill(getpid(), SIGSEGV)
, но я получаю похожие результаты.
РЕДАКТИРОВАТЬ: jbcreix имеет ответ : мой детектор segfault был сломан. Меня обманули, потому что у ksh
такая же проблема. Я пробовал с bash
и bash
правильно каждый раз.
Моя ошибка заключалась в том, что я передавал WNOHANG
в waitpid()
, где я должен был проходить ноль. Я не знаю, о чем я мог думать! Интересно, в чем дело с ksh
, но это отдельный вопрос.