侧边栏壁纸
博主头像
noerror

虚灵不寐,众理具而万事出。

  • 累计撰写 239 篇文章
  • 累计创建 9 个标签
  • 累计收到 2 条评论
标签搜索

目 录CONTENT

文章目录

fmtmsg函数用法详解

noerror
2022-10-04 / 0 评论 / 0 点赞 / 114 阅读 / 930 字 / 正在检测是否收录...

fmtmsg函数用法详解

fmtmsg函数简介

  • 头文件包含
#include <fmtmsg.h>
  • 函数定义
int fmtmsg(long  classification , const char * label ,
           int  severity , const char * text ,
           const char * action , const char * tag );

fmtmsg函数常见使用错误

  • 编译错误
    warning: implicit declaration of function ‘fmtmsg’ [-Wimplicit-function-declaration]
    解决办法:包含头文件
#include <fmtmsg.h>

fmtmsg函数详细描述

此函数在classification参数中指定的设备上显示由其参数描述的消息。对于写到stderr 的消息,格式取决于 MSGVERB 环境变量。
label参数标识消息的源。字符串必须由两个冒号分隔的部分组成,其中第一部分不超过10个字符,第二部分不超过14个字符。
text参数描述错误的条件。
action参数描述了从错误中恢复的可能步骤。如果是打印的,则前缀为“to fix:”。
tag参数是对在线文档的引用,在那里可以找到更多信息。它应该包含label值和唯一的标识号。Dummy arguments每个参数都可以有一个虚拟值。虚拟分类值 MM_NULLMC (0L)没有指定任何输出,因此不会打印任何内容。虚拟严重性值 NO_SEV (0)表示没有提供严重性。值MM_NULLLBL MM_NULLTXT MM_NULLACT MM_NULLTAG 是"((char\ *)\ 0)" 空字符串的同义词,label0是NO_SEV The classification argument的同义词classification参数是描述4种信息的值的总和。
第一个值定义输出通道。

  • MM_PRINT 输出到stderr
  • MM_CONSOLE 输出到系统控制台。
  • "MM_PRINT | MM_CONSOLE" 输出到两者。

第二个值是错误的来源:

  • 发生硬件错误。
  • 发生固件错误。
  • 发生软件错误。

第三个值编码问题的检测器:

  • MM_APPL 它是由应用程序检测到的。
  • MM_UTIL 它是由实用程序检测到的。
  • MM_OPSYS 操作系统检测到它。

第四个值显示了事件的严重程度:

  • MM_RECOVER 这是一个可恢复的错误。
  • MM_NRECOV 这是一个不可恢复的错误。The severity argument severity参数可以采用以下值之一:
  • MM_NOSEV 没有打印严重性。
  • MM_HALT 此值打印为halt。
  • MM_ERROR 此值打印为错误。
  • MM_WARNING 此值打印为警告。
  • MM_INFO 此值作为信息打印。

数值介于0和4之间。使用addseverity (3)或环境变量 SEV_LEVEL ,您可以添加更多的级别和字符串来打印。

fmtmsg函数返回值

该函数可以返回4个值:

  • MM_OK 一切都很顺利。
  • MM_NOTOK 完全失败。
  • MM_NOMSG 写入stderr 时出错
  • MM_NOCON 写入控制台时出错。

fmtmsg函数其他说明

System V和UnixWare手册页告诉我们,这些函数已经被“pfmt()和addsev()”或“pfmt()、vpfmt()、lfmt()和vlfmt()”所取代,稍后将被删除。

fmtmsg函数使用举例

#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,
               "unknown mount option", "See mount(8).",
               "util\-linux:mount:017");
   switch (err) {
   case MM_OK:
       break;
   case MM_NOTOK:
       printf("Nothing printed\en");
       break;
   case MM_NOMSG:
       printf("Nothing printed to stderr\en");
       break;
   case MM_NOCON:
       printf("No console output\en");
       break;
   default:
       printf("Unknown error from fmtmsg()\en");
   }
   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).
0

评论区