Обработка исключений в C без C ++ в Linux - PullRequest
5 голосов
/ 27 августа 2010

Предоставляет ли Linux обработку исключений в C, не прибегая к C ++?Или, что может быть лучшим способом для реализации такой обработки исключений?Цель состоит в том, чтобы не проверять коды возврата для каждой вызываемой функции, но делать что-то вроде C ++, которое является поточно-ориентированным и легко переносимым.

Ответы [ 5 ]

7 голосов
/ 27 августа 2010

Вы можете обрабатывать сигналы, написав для них свои обработчики сигналов. Некоторые из этих сигналов, документированных в GNU:

  • Сигналы программных ошибок: используются для сообщения о серьезных программных ошибках.
  • Сигналы завершения: Используются для прерывания и / или завершения программы.
  • Сигналы тревоги: используются для индикации истечения таймеров.
  • Асинхронные сигналы ввода / вывода: используются для указания наличия входного сигнала.
  • Сигналы управления заданиями: сигналы, используемые для поддержки управления заданиями.
  • Операционные сигналы об ошибках: Используется для сообщения об ошибках операционной системы.
  • Разные сигналы: Разные сигналы.
  • Сигнальные сообщения: печать сообщения, описывающего сигнал

Вы можете получить более подробную информацию об этом здесь . В нем говорится следующее, что я думаю, это то, что вы ищете:

Если вы ожидаете событие, которое вызывает сигналы, вы можете определить обработчик функция и сказать операционной системе, чтобы запустить его, когда этот конкретный тип сигнала приходит.

3 голосов
/ 27 августа 2010

Я никогда не слышал о том, чтобы Linux предоставлял что-то подобное, но на этой странице описана сторонняя библиотека обработки исключений для C: http://www.on -time.com / ddj0011.htm У меня нетудалось найти ссылку для скачивания, однако.

1 голос
/ 28 апреля 2011

Могу ли я предложить вам взглянуть на мою библиотеку exceptions4c ?Он был протестирован в Linux и имеет множество функций, таких как finally блоки, обработка сигналов и своего рода полиморфизм , который позволяет создавать иерархии исключений.Он также поддерживает многопоточность.

1 голос
/ 19 октября 2010

Оффтоп наверное, но я не могу устоять, извините.

Должен сказать, что единственный действительно хороший и всеобъемлющий механизм исключений, который я видел до сих пор, - это SEH-структурированная обработка исключений в Windows.

IT использует модель обработки исключений C ++ (которая поднимает руки, когда исключение генерируется в деструкторе автоматического объекта во время разматывания стека).

Кроме того, это действительно единообразная обработка исключений, поскольку она объединяет как программные исключения, так и сгенерированные аппаратным обеспечением.

Так что, если вам нужна обработка исключений - либо напишите для Windows, либо внедрите нечто подобное для Linux.

P.S. В отличие от многих, считается, что обработка исключений очень далеко - это больше, чем просто прерывание нормального выполнения программы с помощью jmp.

Это также цепочка переговоров о том, кто и как обрабатывает исключение. Это (самое главное) - правильное выполнение cleanup в каждой области, работа с вложенными исключениями и т. Д.

1 голос
/ 19 октября 2010

Ядро делает это, используя goto для перехода к разделам разбивки.

См. Здесь для стандартов кодирования: http://lxr.linux.no/linux+v2.6.34/Documentation/CodingStyle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...