Обработка ошибок в 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 приводит к немедленному завершению без очисткикаких-либо буферов; конечно, при желании к этой функции мож-но обратиться непосредственно.