ОБЗОР
#include <fmtmsg.h>
int fmtmsg(long classification, const char *label,
int severity, const char *text,
const char *action, const char *tag);
ОПИСАНИЕ
Эта функция выводит сообщение, описываемое аргументами, на устройство(а), заданное в аргументе classification. Для сообщений, записываемых в stderr, формат зависит от переменной окружения MSGVERB.В аргументе label задаётся источник сообщения. Строка должна состоять из двух частей, разделённых двоеточиями; первая часть должна быть не более 10 символов, а вторая часть — не более 14.
В аргументе text описывается условие ошибки.
В аргументе action описываются возможные шаги по исправлению ошибки. Если они выводятся, то начинаются с «TO FIX: ».
В аргументе tag указывается ссылка на онлайн-документацию, в которой можно найти дополнительную информацию. Он должен содержать значение label и уникальный идентификационный номер.
Фиктивные аргументы
Каждый аргумент может иметь фиктивное значение. Для фиктивного значения классификации (classification) MM_NULLMC (0L) ничего не выводится, то есть ничего не печатается. Фиктивное значение важности (severity) NO_SEV (0) указывается, если важность не определена. Значения MM_NULLLBL, MM_NULLTXT, MM_NULLACT, MM_NULLTAG являются синонимами ((char *) 0) — пустой строки, а MM_NULLSEV — синоним NO_SEV.Аргумент классификации
Аргумент classification — это сочетание значений, описывающих 4 типа информации.Первое значение определяет канал вывода.
- MM_PRINT
- Вывод в stderr.
- MM_CONSOLE
- Вывод в системную консоль.
- MM_PRINT | MM_CONSOLE
- Вывод в оба места.
Вторым значением описывается источник ошибки.
- MM_HARD
- Произошла аппаратная ошибка.
- MM_FIRM
- Произошла ошибка в микропрограмме.
- MM_SOFT
- Произошла ошибка в программном обеспечении.
В третьем значении кодируется выявитель проблемы.
- MM_APPL
- Обнаружено приложением.
- MM_UTIL
- Обнаружено утилитой.
- MM_OPSYS
- Обнаружено операционной системой.
В четвёртом значении показывается важность инцидента:
- MM_RECOVER
- Это исправимая ошибка.
- MM_NRECOV
- Это неисправимая ошибка.
Аргумент важности
В аргументе severity можно указать одно из следующих значений:- MM_NOSEV
- Важность не печатается.
- MM_HALT
- Это значение печатается как ОСТАНОВ.
- MM_ERROR
- Это значение печатается как ОШИБКА.
- MM_WARNING
- Это значение печатается как ПРЕДУПРЕЖДЕНИЕ.
- MM_INFO
- Это значение печатается как ИНФОРМАЦИОННОЕ.
Числовые значения от 0 до 4. Используя функцию addseverity(3) или переменную окружения SEV_LEVEL вы можете добавить дополнительные уровни и строки для печати.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция может возвращать 4 значения:- MM_OK
- Всё хорошо.
- MM_NOTOK
- Всё плохо.
- MM_NOMSG
- Ошибка записи в stderr.
- MM_NOCON
- Ошибка записи в консоль.
ОКРУЖЕНИЕ
Переменная окружения MSGVERB (message verbosity — детальность сообщения) может использоваться для отключения некоторых частей вывода в stderr (она не влияет на вывод на консоль). Если эта переменная определена, не равна NULL и содержит список допустимых ключевых слов через двоеточие, то печатаются только части сообщения, которые соответствуют этим ключевым словам. Допустимые ключевые слова: «label», «severity», «text», «action» и «tag».Переменная окружения SEV_LEVEL может использоваться для ввода новых уровней важности. По умолчанию, доступно только пять уровней важности, описанных выше. Для любого другого числового значения fmtmsg() ничего не печатает. Если пользователь задал SEV_LEVEL в формате
- SEV_LEVEL=[описание[:описание[:...]]]
в окружении процесса перед первым вызовом fmtmsg() и каждое описание имеет вид
- ключевое-слово-важности,уровень,печатаемая-строка
то fmtmsg() также будет обрабатывать заданные значения уровней (в дополнении к стандартным уровням 0-4), и использовать указанную строку печати, когда встречается такой уровень.
Часть «ключевое-слово-важности» не используется fmtmsg(), но указывается. Часть «уровень» — это строка, представляющая число. Числовое значение должно быть числом более 4. Это значение должно использоваться в аргументе важности fmtmsg() для выбора этого класса. Невозможно заменить любой из предопределённых классов. «Печатаемая-строка» — строка, которая печатается в случае, когда сообщение этого класса обрабатывается fmtmsg().
ВЕРСИИ
Функция fmtmsg() появилась в glibc начиная с версии 2.1.АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).Интерфейс | Атрибут | Значение |
fmtmsg() | безвредность в нитях |
glibc >= 2.16: MT-Safe
glibc < 2.16: MT-Unsafe |
До glibc 2.16 функция fmtmsg() использовала статическую незащищённую переменную, поэтому функцию нельзя использовать в нескольких нитях одновременно.
Начиная с glibc 2.16 функция fmtmsg() использует блокировку для защиты статической переменной, поэтому функцию можно использовать в нескольких нитях одновременно.
СООТВЕТСТВИЕ СТАНДАРТАМ
Функции fmtmsg() и addseverity(3), и переменные окружения MSGVERB и SEV_LEVEL впервые появились в System V.Функция fmtmsg() и переменная окружения MSGVERB описана в POSIX.1-2001 и POSIX.1-2008.
ЗАМЕЧАНИЯ
В справочных страницах System V и UnixWare указано, что эти функции были заменены на «pfmt() и addsev()» или «pfmt(), vpfmt(), lfmt() и vlfmt()», и будут впоследствии удалены.ПРИМЕР
#include <stdio.h> #include <stdlib.h> #include <fmtmsg.h> int main(void) { long class = MM_PRINT | MM_SOFT | MM_OPSYS | MM_RECOVER; int err; err = fmtmsg(class, "util-linux:mount", MM_ERROR, "неизвестный параметр mount", "Смотрите mount(8).", "util-linux:mount:017"); switch (err) { case MM_OK: break; case MM_NOTOK: printf("Нечего печатать\n"); break; case MM_NOMSG: printf("Нечего печатать в stderr\n"); break; case MM_NOCON: printf("Нет вывода на консоль\n"); break; default: printf("Неизвестная ошибка fmtmsg()\n"); } exit(EXIT_SUCCESS); }
Вывод должен быть таким:
util-linux:mount: ОШИБКА: неизвестный параметр mount TO FIX: Смотрите mount(8). util-linux:mount:017а после
MSGVERB=text:action; export MSGVERBвывод станет:
неизвестный параметр mount TO FIX: Смотрите mount(8).