Я бы рекомендовал другой подход.
Напишите программу, которая берет сэмплы и записывает их в стандартный вывод. Ему просто нужно иметь alarm(TIMEOUT);
перед каждым сбором образцов, и если он зависнет, программа автоматически завершится.
Напишите другую программу, которая запускает эту первую программу. Если он выходит, он запускает его снова. Это выглядит примерно так:
main(){for(;;){system("sampler");sleep(1);}}
Затем в другой программе используйте FILE*fp=popen("supervise_sampler","r");
и прочитайте примеры из fp
. Еще лучше: пусть программа просто прочитает примеры из stdin и настаивает на том, чтобы пользователи запускали вашу программу следующим образом:
(while true;do sampler;sleep 1; done)|program
Разделение задачи таким образом упрощает разработку и тестирование, например, вы можете собирать образцы и сохранять их в файл, а затем запускать программу с этим файлом:
sampler > data
program < data
Затем, внося изменения в программу, вы можете просто снова и снова запускать ее для одних и тех же данных.
Включение регистрации данных также тривиально, поэтому, если вы обнаружите серьезную проблему, вы можете снова запустить все свои данные через программу, чтобы найти ошибки.