Технологические интерфейсы
Привлечь внимание системного администратора к возникшим проблемам можно не только помещая сообщения в системный журнал, но и выдавая их в стандартный протокол и/или на системную консоль. Для этого служит функция fmtmsg() (см. листинг 9.4).
#include <fmtmsg.h> int fmtmsg (long classification, const char *label, int severity, const char *text, const char *action, const char *tag);Листинг 9.4. Описание функции fmtmsg().
Функция fmtmsg() конструирует отформатированное сообщение, включая в него все аргументы, кроме первого.
Аргумент classification определяет источник и способ отображения сообщения. Он формируется как сумма констант, по одной из каждого класса. Классификация верхнего уровня определяет источник проблемы. В этот класс входят константы MM_HARD (аппаратура), MM_SOFT (программное обеспечение), MM_FIRM (программно-аппаратные средства). Сообщения, порожденные программным обеспечением, могут дополнительно классифицироваться константами MM_APPL (приложение), MM_UTIL (служебная программа), MM_OPSYS (операционная система). Проблемы классифицируются также по признаку нейтрализуемости – соответственно, MM_RECOVER и MM_NRECOV.
Если сообщение предполагается направить в стандартный протокол, к значению аргумента classification следует прибавить константу MM_PRINT ; вывод на системную консоль задает константа MM_CONSOLE. Возможно одновременное указание обеих констант.
Константа MM_NULLMC означает отсутствие классификационного компонента (естественно, ее значение равно нулю).
Аргумент label специфицирует первый из пяти компонентов выдаваемого сообщения. Он, как и classification, определяет источник сообщения, но делает это по-своему. Указуемая цепочка символов должна состоять из двух полей, разделенных двоеточием. Первое поле состоит не более чем из десяти байт, второе – из четырнадцати.
Аргумент severity характеризует серьезность проблемы. Стандартом POSIX-2001 предусмотрены следующие уровни серьезности.
MM_HALT
В приложении встретилась серьезная ошибка, его работа остановлена. В выводимую цепочку вставляется текст " HALT ".
MM_ERROR
В работе приложения обнаружена ошибка. В выводимую цепочку вставляется текст " ERROR ".
MM_WARNING
При работе приложения возникла необычная ситуация, возможно, являющаяся ошибочной и требующая внимания. В выводимую цепочку вставляется текст " WARNING ".
MM_INFO
Информация о ситуации, не являющейся ошибочной. В выводимую цепочку вставляется текст " INFO ".
MM_NOSEV
Данная константа обозначает отсутствие у сообщения уровня серьезности.
Аргумент text в свободной форме описывает ситуацию, приведшую к генерации сообщения.
Аргумент action также в свободной форме описывает первый шаг по нейтрализации ошибки. Перед цепочкой, на которую указывает action, в сообщение вставляется префикс " TO FIX:".
Аргумент tag служит ссылкой на документацию по выявленной проблеме.
На работу функции fmtmsg() влияет переменная окружения MSGVERB, которая определяет, какие из пяти возможных компонентов сообщения будут выданы в стандартный протокол (на консоль всегда выдается полное сообщение ). Значение этой переменной в общем случае состоит из пяти ключевых слов – label, severity, text, action, tag – разделенных двоеточиями. Если какие-то ключевые слова отсутствуют, соответствующие компоненты сообщения в стандартный протокол выданы не будут. Если переменная MSGVERB отсутствует в окружении, имеет пустое или некорректное значение, сообщение выдается целиком.
Возможные результаты функции fmtmsg() устроены необычным образом. Константа MM_OK обозначает полный успех, MM_NOTOK – полную неудачу, MM_NOMSG – невозможность выдать сообщение в стандартный протокол, MM_NOCON – невозможность вывода на консоль.
Приведем не очень серьезный пример применения функции fmtmsg() (см. листинг 9.5).
#include <stdio.h> #include <fmtmsg.h> int main (void) { if (fmtmsg (MM_SOFT + MM_OPSYS + MM_RECOVER + MM_PRINT + MM_CONSOLE, "POSIX:fmtmsg", MM_INFO, "Отсутствует функция fmtmsg()", "Установите функцию fmtmsg() или не пользуйтесь ею\n", "См. functions/fmtmsg.html") != MM_OK) { perror ("FMTMSG"); return (1); } return 0; }Листинг 9.5. Пример использования функции fmtmsg().
В результате выполнения приведенной программы в стандартный протокол и на системную консоль будет выдано следующее сообщение (см. листинг 9.6).
POSIX:fmtmsg: INFO: Отсутствует функция fmtmsg() TO FIX: Установите функцию fmtmsg() или не пользуйтесь ею См. functions/fmtmsg.htmlЛистинг 9.6. Возможные результаты выполнения программы, использующей функцию fmtmsg().
Читателю предлагается самостоятельно поэкспериментировать с этой программой, варьируя значение переменной окружения MSGVERB.