Как я могу сразу закрыть программу на C? - PullRequest
22 голосов
/ 02 ноября 2011

Я пишу код C, в котором я анализирую некоторые данные. Я установил программу для обработки только 100 входных данных. Когда он имеет более 100 входов, он дает ошибку сегментации. Я хочу создать способ, чтобы, когда количество входов превысило 100, пользователь был предупрежден, и программа прекратила работу. Я знаю, как сделать это из основной функции просто с помощью return 0, однако я нахожусь в нескольких вызовах функций вдали от основного, и трудно сделать так, чтобы даже return 0 в этой функции продолжал работать.

Есть ли какой-нибудь немедленный способ завершить всю программу, не находясь в основном?

Ответы [ 4 ]

38 голосов
/ 02 ноября 2011

Стандартная функция exit - это то, что вы ищете:

Обычно завершает процесс, выполняя обычную очистку для завершения процессов.

Сначала все функции, зарегистрированные вызовами atexit, выполняются в порядке, обратном их регистрации. Затем все потоки закрываются, временные файлы удаляются, и, наконец, элемент управления возвращается в среду хоста.

Аргумент состояния возвращается в хост-среду.

Было бы лучше, если бы вы исправили ошибку segfault.

6 голосов
/ 02 ноября 2011

Вам нужно включить стандартную библиотеку lib, а затем вы можете вызвать exit там, где вы хотите:

#include <stdlib.h>
...
exit(status);

где status - это целое число, представляющее код выхода. Для какого статуса беспокойства: для соглашения 0 - успех, другие значения указывают на статус ошибки.

2 голосов
/ 02 ноября 2011

Вы также можете fprintf(stderr, ....) и затем позвонить abort();это может быть полезно, если вы хотите позже отладить вашу ошибку.

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

1 голос
/ 28 января 2016

Чуть лучше, возможно, поймать ошибку сегментации с помощью обработчика сигнала и заставить обработчик сигнала поднять сигнал SIGSTOP.

Таким образом, ваша программа останавливается, но остается в памяти. Затем вы можете подключиться к нему с помощью отладчика и увидеть программу во всей красе, застывшую на месте в тот момент, когда произошел SEGFAULT.

Это может быть полезно для поиска проблем в долго работающих программах, которые вы не запускаете в среде разработки.

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