LINUX.ORG.RU

Аномальный segfault

 ,


0

2

Пытаясь написать простенькое клиент-серверное приложение, столкнулся с одной штукой, выглядящей крайней аномально. Сервер должен уметь обрабатывать поступивший SIGHUP, написав пустой обработчик, содержащий один printf, я запустил сервер, послал руками сигнал. Программа успешно зашла в обработчик, но после сразу вывалилась в сегфолт (ошибка сегментирования). Я, особо не запариваясь, закомментировал все более менее опасные участки программы, в конце сделав обычный while(1) sleep(1); (чтоб можно было спокойно послать сигнал), снова попытал счастья, послал соответствующий сигнал ...и снова сегфолт!, откуда?! программа висит бесконечном цикле, никаких операций с указателями не производится, и сегфолт! Я начал комментировать строку за строкой вышележащей программы (хотя казалось бы какой смысл, до цикла я ведь дошел успешно) и нашел виновника сегфолта. Им оказалoсь более чем невинное объявление переменной char *sockpath; Каким образом безобидная переменная, которая фактически нигде не используется (все закомментировано) может вызвать сегфолт? Предположение о том,что так происходит из-за того что переменная не инициализирована оказалось неверным. Вот собственно код http://pastebin.com/zSFSCCCA

★★★

valgrind

Прогони через Valgrind

CyberK
()

signal safe functions как вариант.

anonymous
()

Printf не реентерабелен, а у тебя он стоит одновременно в прерывании и в main. /тредж

d_a ★★★★★
()

Ты лучше ставь флаг о том, что получил HUP, и при выходе из sleep (а он произойдет сразу после выхода из обработчика) проверяй этот флаг. В clib редко где реентрантный и полностью юзать его в сигнальном обработчике нельзя. Хотя может ты в другом месте валишься.

anonymous
()
Ответ на: комментарий от dimon555

У меня само по себе ничего не вываливается кстати, правда при использовании pause(), сегфолт никуда не делся.

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

Ну значит, еще косяки есть. Роняй в корку и корку засовывай в gdb, если не понимаешь что происходит.

d_a ★★★★★
()

У меня сегфолта с твоим кодом нет.

Попробуй полностью инициализировать переменную sa

anonymous
()
Ответ на: комментарий от AptGet

Да вы правы, спасибо. Все из-за это было.

LIKAN ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.