#include <fmtmsg.h> int fmtmsg(long classification, const char *label, int severity, const char *text, const char *action, const char *tag);
label 引数はメッセージの発生源を識別する。 この文字列はコロンで区切られた 2 つの部分から構成されていなければならない。 1 つ目の部分は 10 文字以内でなければならず、 2 つ目の部分は 14 文字以内でなければならない。
text 引数にはエラー条件を記述する。
action 引数にはエラーから回復するために利用可能なステップを記述する。 これが表示される場合、"TO FIX: " が前に付く。
tag 引数はより多くの情報を見つけるためのオンラインドキュメントへの参照である。 これは label 値とユニークな識別番号を含んでいるべきである。
最初の値は出力チャンネルを定義する。
2 番目の値はエラーの発生源である:
3 番目の値は問題の検知を行ったものをエンコードする:
4 番目の値は問題の重大度を表す:
数値の場合は 0 から 4 である。 addseverity(3) または環境変数 SEV_LEVEL を使うことにより、表示するレベルと文字列を更に追加できる。
環境変数 SEV_LEVEL は新しい重大度レベルを導入するのに使用できる。 デフォルトでは、上記の 5 つの重大度レベルのみが利用可能である。 他の数値の場合、 fmtmsg() は何も表示しない。 fmtmsg() を初めて呼び出す前に、ユーザーが SEV_LEVEL を
のような形式でプロセスの環境に設定すると、 fmtmsg() は (標準のレベル 0-4 に加えて) level に指定された値も受け付け、 そのようなレベルの問題が発生すると指定された printstring を表示する。 各 description は
という形式である。
severity-keyword 部は fmtmsg() に使用されないが、存在しなければならない。 level 部は数値を文字列で表したものである。 数値は 4 より大きい値でなければならない。 この値は fmtmsg() の severity 引数で使用されなければならず、この重大度を選択する。 前もって宣言された重大度を上書きすることはできない。 printstring は、 この重大度のメッセージが fmtmsg() によって生成された場合に表示される文字列である。
インターフェース | 属性 | 値 |
fmtmsg() | Thread safety |
glibc >= 2.16: MT-Safe
glibc < 2.16: MT-Unsafe |
glibc 2.16 より前のバージョンでは、 fmtmsg() 関数は、 保護されていない静的な変数を使うため、 スレッドセーフではない。
glibc 2.16 以降では、 fmtmsg() 関数はロックを使って静的な変数を保護しており、 スレッドセーフである。
関数 fmtmsg() と環境変数 MSGVERB は POSIX.1-2001 と POSIX.1-2008 に規定されている。
int
main(void)
{
long class = MM_PRINT | MM_SOFT | MM_OPSYS | MM_RECOVER;
int err;
err = fmtmsg(class, "util-linux:mount", MM_ERROR,
"unknown mount option", "See mount(8).",
"util-linux:mount:017");
switch (err) {
case MM_OK:
break;
case MM_NOTOK:
printf("Nothing printed\n");
break;
case MM_NOMSG:
printf("Nothing printed to stderr\n");
break;
case MM_NOCON:
printf("No console output\n");
break;
default:
printf("Unknown error from fmtmsg()\n");
}
exit(EXIT_SUCCESS);
}
出力は
util-linux:mount: ERROR: unknown mount option TO FIX: See mount(8). util-linux:mount:017
のようになり、
MSGVERB=text:action; export MSGVERB
を実行すると、次のようになる。
unknown mount option TO FIX: See mount(8).