Опубликован: 06.12.2004 | Доступ: свободный | Студентов: 1180 / 143 | Оценка: 4.76 / 4.29 | Длительность: 20:58:00
ISBN: 978-5-9556-0021-5
Лекция 9:

Технологические интерфейсы

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