Язык С

Обработка ошибок - STDERR и EXIT


Обработка ошибок в CAT неидеальна. Неудобство заключает- ся в том, что если один из файлов по некоторой причине ока- зывается недоступным, диагностическое сообщение об этом пе- чатается в конце объединенного вывода. Это приемлемо, если вывод поступает на терминал, но не годится, если вывод пос- тупает в некоторый файл или через поточный (PIPELINE) меха- низм в другую программу. Чтобы лучше обрабатывать такую ситуацию, к программе точно таким же образом, как STDIN и STDOUT, присоединяется второй выходной файл, называемый STDERR. Если это вообще возможно, вывод, записанный в файле STDERR, появляется на терминале пользователя, даже если стандартный вывод направ- ляется в другое место. Давайте переделаем программу CAT таким образом, чтобы сообщения об ошибках писались в стандартный файл ошибок.

"INCLUDE <STDIO.H>

MAIN(ARGC,ARGV) /*CAT: CONCATENATE FILES*/ INT ARGC; CHAR *ARGV[]; \( FILE *FP, *FOPEN(); IF(ARGC==1) /*NO ARGS; COPY STANDARD INPUT*/ FILECOPY(STDIN); ELSE WHILE (--ARGC > 0) IF((FP=FOPEN(*++ARGV,"R#))==NULL) \( PRINTF(STDERR, "CAT: CAN'T OPEN,%S\N", ARGV); EXIT(1); \) ELSE \( FILECOPY(FP); \) EXIT(0); \)

Программа сообщает об ошибках двумя способами. Диагностичес- кое сообщение, выдаваемое функцией FPRINTF, поступает в STDERR и, таким образом, оказывается на терминале пользова- теля, а не исчезает в потоке (PIPELINE) или в выходном фай- ле. Программа также использует функцию EXIT из стандартной библиотеки, обращение к которой вызывает завершение выполне- ния программы. Аргумент функции EXIT доступен любой програм- ме, обращающейся к данной функции, так что успешное или неу- дачное завершение данной программы может быть проверено дру- гой программой, использующей эту в качестве подзадачи. По соглашению величина 0 в качетсве возвращаемого значения сви- детельствует о том, что все в порядке, а различные ненулевые значения являются признаками нормальных ситуаций.

Функция EXIT вызывает функцию FCLOSE для каждого откры- того выходного файла, с тем чтобы вывести всю помещенную в буферы выходную информацию, а затем вызывает функцию _EXIT. Функция _EXIT приводит к немедленному завершению без очистки каких-либо буферов; конечно, при желании к этой функции мож- но обратиться непосредственно.



    Содержание раздела