Scroll to navigation

FMTMSG(3) Руководство программиста Linux FMTMSG(3)

ИМЯ

fmtmsg - выводит отформатированные сообщения об ошибках

СИНТАКСИС

#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 типа информации.

Первое значение определяет канал вывода.

Вывод в stderr.
Вывод в системную консоль.
Вывод в оба места.

Вторым значением описывается источник ошибки.

Произошла аппаратная ошибка.
Произошла ошибка в микропрограмме.
Произошла ошибка в программном обеспечении.

В третьем значении кодируется выявитель проблемы.

Обнаружено приложением.
Обнаружено утилитой.
Обнаружено операционной системой.

В четвёртом значении показывается важность инцидента:

Это исправимая ошибка.
Это неисправимая ошибка.

Аргумент важности

В аргументе severity можно указать одно из следующих значений:

Важность не печатается.
Это значение печатается как ОСТАНОВ.
Это значение печатается как ОШИБКА.
Это значение печатается как ПРЕДУПРЕЖДЕНИЕ.
Это значение печатается как ИНФОРМАЦИОННОЕ.

Числовые значения от 0 до 4. Используя функцию addseverity(3) или переменную окружения SEV_LEVEL вы можете добавить дополнительные уровни и строки для печати.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Функция может возвращать 4 значения:

Всё хорошо.
Всё плохо.
Ошибка записи в stderr.
Ошибка записи в консоль.

ОКРУЖЕНИЕ

Переменная окружения 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: ERROR: unknown mount option
TO FIX: Смотрите mount(8).  util-linux:mount:017

а после


MSGVERB=text:action; export MSGVERB

вывод станет:


неизвестный параметр mount

TO FIX: Смотрите mount(8).

СМ. ТАКЖЕ

addseverity(3), perror(3)

ЗАМЕЧАНИЯ

Эта страница является частью проекта Linux man-pages версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.

ПЕРЕВОД

Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.

9 июня 2020 г.