Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс ПЯВУ 2 сем / Лекции 2 сем / Л№35.Аргументы кс / Лекция № 30.Аргументы командной строки..odt
Скачиваний:
12
Добавлен:
17.04.2015
Размер:
58.31 Кб
Скачать

14. Завершение Программы

Обычный способ завершения программы - просто возврат функции main. Значение состояния выхода, возвращенное из функции main используется, чтобы сообщить информацию обратно родительскому процессу или оболочке.

Программа может также завершаться вызывая функцию exit.

Кроме того, программы могут быть завершены сигналами; это обсуждено более подробно в [Обработка Сигналов]. Функция abort вызывает сигнал, который уничтожает программу.

Нормальное Окончание

Процесс завершается обычно, когда программа вызывает exit. Возвращение из main эквивалентно вызову exit, и значение, которое main возвращает, используется как аргумент exit.

void exit (int status) (функция)

Функция exit завершает процесс с состоянием status. Эта функция не возвращается.

Нормальное окончание вызывает следующие действия:

Функции, которые были зарегистрированы с atexit или on_exit функциями, вызываются в обратном порядке их регистрации. Этот механизм позволяет вашему приложению определять собственные действия "очистки", которые нужно выполнить по окончании программы. Обычно, это используется, чтобы делать вещи подобно сохранению информации о состоянии программы в файле, или размыкании блокировок в базах общих данных.

Все открытые потоки будут закрыты. См. Раздел 7.4 [Закрытие Потоков]. Кроме того, временные файлы, открытые с tmpfile функцией будут удалены; см. Раздел 9.10 [Временные Файлы].

_exit вызывается, завершая программу. См. Раздел 22.3.5 [Внутренняя организация Окончания].

Состояние Выхода

Когда программа выходит, она может возвращать родительскому процессу малое количество информации относительно причины окончания, используя состояние exit. Это - значение между 0 и 255, которое выходящий процесс передает как аргумент exit.

Обычно Вы должны использовать состояние exit, чтобы сообщить очень широкую информацию относительно успеха или отказа. Вы не можете обеспечивать множество подробностей относительно причин для отказа, да и большинство родительских процессов не требуют много подробностей.

Имеются соглашения для того, что некоторые программы должны возвратить. Наиболее общее соглашение - просто 0 для успеха и 1 для отказа. Программы, которые выполняют сравнение, используют другое соглашение: они используют состояние, 1, чтобы указать несоответствие, и состояние 2, чтобы указать неспособность сравнить. Ваша программа должна следовать за существующим соглашением, если существующее соглашение имеет смысл для нее.

Общее соглашение резервирует значения 128 состояний и более для специальных целей. В частности значение 128 используется, чтобы указать отказ выполнить другую программу в подпроцессе. Это соглашение не удовлетворяет унивверсальным условиям, но неплохо следовать за ним в ваших программах.

Предупреждение: Не пробуйте использовать число ошибок как состояние exit. Это фактически не очень полезно; родительский процесс вообще не должен заботиться, сколько ошибок произошло. К тому же значение состояния усекается до восьми бит. Таким образом, если программа пробовала передать 256, родитель получит 0 шибок т.е. успех.

По той же самой причине не работает использование значения errno как состояния exit.

Примечание Переносимости: Некоторые не-posix системы используют различные соглашения для значений состояния exit. Для большей переносимости, Вы можете использовать макрокоманды EXIT_SUCCESS и EXIT_FAILURE для стандартного значения состояния успеха и отказа, соответственно. Они объявлены в файле " stdlib.h ".

int EXIT_SUCCESS (макрос)

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

На системах POSIX, значение этой макрокоманды - 0. В других системах, значение может быть другим (возможно не-константа) целочисленным выражением.

int EXIT_FAILURE (макрос)

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

На системах POSIX, значение этой макрокоманды 1. На других системах, значение может быть другим.

Очистки на Выходе

Ваша программа может выполнить собственные функции очистки при нормальное окончании. Ненадежно вызывать функции очистки явно перед выходом. Намного лучше делать очистку невидимой для приложения, устанавливая функцию очистки используя atexit или on_exit.

int atexit (void (*function) (void)) (функция)

Atexit функция регистрирует функцию function, которую нужно вызвать при нормальном окончании программы. Функция вызывается без аргументов.

Возвращаемое значение из atexit - нуль при успехе и отличное от нуля, если функция не может быть зарегистрирована.

int on_exit (void (*function)(int status, void *arg), void *arg)

Эта функция - несколько более мощный вариант atexit. Она принимает два аргумента, функцию и произвольный указатель. При нормальном окончании программы, функция вызывается с двумя аргументами: значением состояния, переданным exit, и параметром arg.

Эта функция включена в библиотеку GNU C только для совместимости с SunOS, и может не обеспечиваться другими реализациями.

Имеется тривиальная программа, которая иллюстрирует использование exit и atexit:

#include <stdio.h>

#include <stdlib.h>

void

bye (void)

{

puts ("Goodbye, cruel world....");

}

int

main (void)

{

atexit (bye);

exit (EXIT_SUCCESS);

}

Когда эта программа выполнена, она печатает сообщение и выходит.