Solaris 10 资源管理器开发者指南

第 4 章 使用用于扩展记帐的 Perl 接口

Perl 接口可提供与扩展记帐任务和项目的 Perl 绑定。使用该接口,Perl 脚本可读取 exacct 框架所生成的记帐文件,还可以编写 exacct 文件。

本章包含以下主题:

扩展记帐概述

exacct 是 Solaris 操作环境的一种新记帐框架,其中除了提供传统 SVR4 记帐机制所提供的功能以外,还提供其他功能。传统的 SVR4 记帐具有以下缺点:

exacct 框架解除了 SVR4 记帐的限制,并且为记帐数据集合提供了可配置、开放且可扩展的框架。

有关扩展记帐的更详细概述,请参见《系统管理指南:Solaris Containers-资源管理和 Solaris Zones》中的第 4  章 “扩展记帐(概述)”

用于 libexacct 的 Perl 接口

对象模型

Sun::Solaris::Exacct 模块是由 libexacct(3LIB) 库所提供的所有类的父类。libexacct(3LIB) 提供对以下各种类型的实体的操作:exacct 格式文件、catalog 标记和 exacct 对象。exacct 对象会细分为两种类型。

使用用于 libexacct 的 Perl 接口的优点

扩展记帐的 Perl 扩展可为基础 libexacct(3LIB) API 提供 Perl 接口以及以下增强功能。

Perl 复合型标量 (double-typed scalar)

本文档中介绍的模块广泛使用 Perl 复合型标量功能。使用复合型标量功能可将标量值作为整数或字符串,具体取决于上下文。此行为与 $!Perl 变量 (errno) 表现的行为相同。复合型标量功能无需从整数值映射为对应的字符串即可显示值。以下示例说明了复合型标量的使用。

# Assume $obj is a Sun::Solaris::Item

my $type = $obj->type();



# prints out "2 EO_ITEM"

printf("%d %s\n", $type, $type);



# Behaves as an integer, $i == 2

my $i = 0 + $type;



# Behaves as a string, $s = "abc EO_ITEM xyx"

my $s = "abc $type xyz";

Perl 模块

各种与项目、任务和 exacct 相关的函数已分为多个组,并且每个组都置于单独的 Perl 模块中。每个函数都具有 Sun Microsystems 标准的 Sun::Solaris::Perl 软件包前缀。

表 4–1 Perl 模块

模块 

说明 

Sun::Solaris::Project 模块

提供用于访问以下项目操作函数的功能:getprojid(2)、setproject(3PROJECT)、project_walk(3PROJECT)、getprojent(3PROJECT)、getprojbyname(3PROJECT)、getprojbyid(3PROJECT)、getdefaultproj(3PROJECT)、inproj(3PROJECT)、getprojidbyname(3PROJECT)、setprojent(3PROJECT)、endprojent(3PROJECT)、fgetprojent(3PROJECT)。

Sun::Solaris::Task 模块

提供用于访问任务操作函数 settaskid(2) 和 gettaskid(2) 的功能。

Sun::Solaris::Exacct 模块

顶层 exacct 模块。此模块中的函数可访问与 exacct 有关的系统调用 getacct(2)、putacct(2) 和 wracct(2) 以及 libexacct(3LIB) 库函数 ea_error(3EXACCT)。此模块包含各种 exacct EO_*EW_*EXR_*P_*TASK_* 宏的所有常量。

Sun::Solaris::Exacct::Catalog 模块

提供面向对象的方法,用于访问 exacct 目录标记中的位字段,以及 EXC_*EXD_*EXD_* 宏。

Sun::Solaris::Exacct::File 模块

提供面向对象的方法,用于访问以下 libexacct(3LIB) 记帐文件函数:ea_open(3EXACCT)、ea_close(3EXACCT)、ea_get_creator(3EXACCT)、ea_get_hostname(3EXACCT)、ea_next_object(3XACCT)、ea_previous_object(3EXACCT)、ea_write_object(3EXACCT)。

Sun::Solaris::Exacct::Object 模块

提供面向对象的方法,用于访问单个 exacct 记帐文件对象。exacct 对象表示为指定属于相应 Sun::Solaris::Exacct::Object 子类的不透明引用。此模块可细分为两种可能的对象类型:项和组。另外,还提供了用于访问 ea_match_object_catalog(3EXACCT)、ea_attach_to_object(3EXACCT) 函数的方法。

Sun::Solaris::Exacct::Object::Item 模块

提供面向对象的方法,用于访问单个 exacct 记帐文件项。此类型的对象从 Sun::Solaris::Exacct::Object 中继承。

Sun::Solaris::Exacct::Object::Group 模块

提供面向对象的方法,用于访问单个 exacct 记帐文件组。此类型的对象从 Sun::Solaris::Exacct::Object 中继承,并提供了对 ea_attach_to_group(3EXACCT) 函数的访问。组中包含的各项表示为 perl 数组。

Sun::Solaris::Exacct::Object::_Array 模块

专用数组类型,用作 Sun::Solaris::Exacct::Object::Group 中的数组类型。

Sun::Solaris::Project 模块

Sun::Solaris::Project 模块可以为与项目相关的系统调用和 libproject(3LIB) 库提供包装。

Sun::Solaris::Project 常量

Sun::Solaris::Project 模块使用与项目相关的头文件中的常量。

MAXPROJID

PROJNAME_MAX

PROJF_PATH

PROJECT_BUFSZ

SETPROJ_ERR_TASK

SETPROJ_ERR_POOL

Sun::Solaris::Project 函数、类方法和对象方法

libexacct(3LIB) API 的 perl 扩展为项目提供了以下函数。

setproject(3PROJECT)

setprojent(3PROJECT)

getdefaultproj(3PROJECT)

inproj(3PROJECT)

getprojent(3PROJECT)

fgetprojent(3PROJECT)

getprojbyname(3PROJECT)

getprojbyid(3PROJECT)

getprojbyname(3PROJECT)

endprojent(3PROJECT)

Sun::Solaris::Project 模块不包含类方法。

Sun::Solaris::Project 模块不包含对象方法。

Sun::Solaris::Project 导出

缺省情况下,此模块中不会导出任何内容。可以使用以下标记有选择性地导入此模块中定义的常量和函数。

标记 

常量或函数 

:SYSCALLS

getprojid()

:LIBCALLS

setproject()activeprojects()getprojent()setprojent()endprojent()getprojbyname()getprojbyid()getdefaultproj()fgetprojent()inproj()getprojidbyname()

:CONSTANTS

MAXPROJID_TASKPROJNAME_MAXPROJF_PATHPROJECT_BUFSZSETPROJ_ERRSETPROJ_ERR_POOL

:ALL

:SYSCALLS:LIBCALLS:CONSTANTS

Sun::Solaris::Task 模块

Sun::Solaris::Task 模块可以为 settaskid(2) 和 gettaskid(2) 系统调用提供包装。

Sun::Solaris::Task 常量

Sun::Solaris::Task 模块使用以下常量。

TASK_NORMAL

TASK_FINAL

Sun::Solaris::Task 函数、类方法和对象方法

libexacct(3LIB) API 的 perl 扩展为任务提供了以下函数。

settaskid(2)

gettaskid(2)

Sun::Solaris::Task 模块不包含类方法。

Sun::Solaris::Task 模块不包含对象方法。

Sun::Solaris::Task 导出

缺省情况下,此模块中不会导出任何内容。可以使用以下标记有选择性地导入此模块中定义的常量和函数。

标记 

常量或函数 

:SYSCALLS

settaskid()gettaskid()

:CONSTANTS

TASK_NORMALTASK_FINAL

:ALL

:SYSCALLS:CONSTANTS

Sun::Solaris::Exacct 模块

Sun::Solaris::Exacct 模块可以为 ea_error(3EXACCT) 函数和所有的 exacct 系统调用提供包装。

Sun::Solaris::Exacct 常量

Sun::Solaris::Exacct 模块可提供各种 exacct 头文件中的常量。P_PIDP_TASKIDP_PROJID 以及所有的 EW_*EP_*EXR_* 宏都是在模块生成过程中提取的。宏是从 /usr/include 下的 exacct 头文件中提取的,并且会被作为 Perl 常量提供。传递给 Sun::Solaris::Exacct 函数的常量可以是整数值(如 EW_FINAL)或同一变量的字符串表示形式(如 “EW_FINAL”)。

Sun::Solaris::Exacct 函数、类方法和对象方法

libexacct(3LIB) API 的 perl 扩展为 Sun::Solaris::Exacct 模块提供了以下函数。

getacct(2)

putacct(2)

wracct(2)

ea_error(3EXACCT)

ea_error_str

ea_register_catalog

ea_new_file

ea_new_item

ea_new_group

ea_dump_object


注 –

ea_error_str() 作为一种便利方式提供,以便避免使用与以下类似的重复代码块:

if (ea_error() == EXR_SYSCALL_FAIL) {

        print("error: $!\n");

} else {

        print("error: ", ea_error(), "\n");

}

Sun::Solaris::Exacct 模块不包含类方法。

Sun::Solaris::Exacct 模块不包含对象方法。

Sun::Solaris::Exacct 导出

缺省情况下,此模块中不会导出任何内容。可以使用以下标记有选择性地导入此模块中定义的常量和函数。

标记 

常量或函数 

:SYSCALLS

getacct()putacct()wracct()

:LIBCALLS

ea_error()ea_error_str()

:CONSTANTS

P_PIDP_TASKIDP_PROJID

EW_*EP_*EXR_*

:SHORTAND

ea_register_catalog()ea_new_catalog()ea_new_file()ea_new_item()ea_new_group()ea_dump_object()

:ALL

:SYSCALLS:LIBCALLS:CONSTANTS:SHORTHAND

:EXACCT_CONSTANTS

:CONSTANTS 以及 Sun::Solaris::CatalogSun::Solaris::FileSun::Solaris::Object:CONSTANTS 标记

:EXACCT_ALL

:ALL 以及 Sun::Solaris::CatalogSun::Solaris::FileSun::Solaris::Object:ALL 标记

Sun::Solaris::Exacct::Catalog 模块

Sun::Solaris::Exacct::Catalog 模块可以为用作目录标记的 32 位整数提供包装。该目录标记表示为指定属于 Sun::Solaris::Exacct::Catalog 类的 Perl 对象。可以使用多种方法来处理目录标记中的字段。

Sun::Solaris::Exacct::Catalog 常量

所有的 EXT_*EXC_*EXD_* 宏都是在模块生成过程中从 /usr/include/sys/exact_catalog.h 文件中提取的,并且是作为常量提供的。传递给 Sun::Solaris::Exacct::Catalog 方法的常量可以是整数值(如 EXT_UINT8)或同一个变量的字符串表示形式(如 “EXT_UINT8”)。

Sun::Solaris::Exacct::Catalog 函数、类方法和对象方法

libexacct(3LIB) API 的 Perl 扩展为 Sun::Solaris::Exacct::Catalog 模块提供了以下类方法。Exacct(3PERL)Exacct::Catalog(3PERL)

register

new

libexacct(3LIB) API 的 Perl 扩展为 Sun::Solaris::Exacct::Catalog 提供了以下对象类方法。

value

type

catalog

id

type_str

catalog_str

id_str

Sun::Solaris::Exacct::Catalog 导出

缺省情况下,此模块中不会导出任何内容。可以使用以下标记有选择性地导入此模块中定义的常量和函数。

标记 

常量或函数 

:CONSTANTS

EXT_*EXC_*EXD_*

:ALL

:CONSTANTS

此外,还可以有选择地将使用 register() 函数定义的任何常量导出到调用方软件包中。

Sun::Solaris::Exacct::File 模块

Sun::Solaris::Exacct::File 模块可为用于处理记帐文件的 exacct 函数提供包装。该接口面向对象,并且允许创建和读取 exacct 文件。此模块所包装的 C 库调用包括以下各项:

ea_open(3EXACCT)

ea_close(3EXACCT)

ea_next_object(3EXACCT)

ea_previous_object(3EXACCT)

ea_write_object(3EXACCT)

ea_get_object(3EXACCT)

ea_get_creator(3EXACCT)

ea_get_hostname(3EXACCT)

文件的读写方法可用于对 Sun::Solaris::Exacct::Object 对象执行操作。这些方法可执行所有必需的内存管理、压缩、解压缩以及所需的结构转换操作。

Sun::Solaris::Exacct::File 常量

Sun::Solaris::Exacct::File 可提供 EO_HEADEO_TAILEO_NO_VALID_HDREO_POSN_MSKEO_VALIDATE_MSK 常量。new() 方法所需的其他常量位于标准的 Perl Fcntl 模块中。表 4–2 介绍了针对 $oflags$aflags 的各种值的 new() 操作。

Sun::Solaris::Exacct::File 函数、类方法和对象方法

Sun::Solaris::Exacct::File 模块不包含函数。

libexacct(3LIB) API 的 Perl 扩展为 Sun::Solaris::Exacct::File 提供了以下类方法。

new

下表介绍了 $oflags$aflags 参数组合的 new() 操作。

表 4–2 $oflags$aflags 参数

$oflags 

$aflags 

操作 

O_RDONLY

不存在或为 EO_HEAD

打开以便在文件开头进行读取。 

O_RDONLY

EO_TAIL

打开以便在文件结尾进行读取。 

O_WRONLY

已忽略 

文件必须存在,打开以便在文件结尾进行写入。 

O_WRONLY | O_CREAT

已忽略 

如果文件不存在,请创建文件。否则,截断并打开以便进行写入。 

O_RDWR

已忽略 

文件必须存在,打开以便在文件结尾进行读取或写入。 

O_RDWR | O_CREAT

已忽略 

如果文件不存在,请创建文件。否则,截断并打开以便进行读取或写入。 


注 –

$oflags 的唯一有效值是 O_RDONLYO_WRONLYO_RDWRO_CREAT 的组合。$aflags 用于描述文件中要求对 O_RDONLY 进行的定位。允许使用 EO_HEADEO_TAIL。如果不存在,则假设使用 EO_HEAD


libexacct(3LIB) API 的 perl 扩展为 Sun::Solaris::Exacct::File 提供了以下对象方法。

creator

hostname

next

previous

get

write


注 –

关闭 Sun::Solaris::Exacct::File。 对于 Sun::Solaris::Exacct::File,不存在显式的 close() 方法。如果未定义或重新指定了文件句柄对象,则将关闭该文件。


Sun::Solaris::Exacct::File 导出

缺省情况下,此模块中不会导出任何内容。可以使用以下标记有选择性地导入此模块中定义的常量。

标记 

常量或函数 

:CONSTANTS

EO_HEADEO_TAILEO_NO_VALID_HDREO_POSN_MSKEO_VALIDATE_MSK

:ALL

:CONSTANTSFcntl(:DEFAULT)

Sun::Solaris::Exacct::Object 模块

Sun::Solaris::Exacct::Object 模块可用作两种可能类型的 exacct 对象(项和组)的父对象。exacct Item 是指单个数据值、嵌入的 exacct 对象或原始数据块。进程占用的用户 CPU 时间(秒数)即是一个单个数据值的示例。exacct Group 是指 exacct 项(如特定进程或任务的所有资源使用情况的值)的有序集合。如果需要将组彼此嵌套,则可以将内部组作为封闭组内嵌入的 exacct 对象存储。

Sun::Solaris::Exacct::Object 模块包含对于 exacct 项和组都通用的方法。请注意,Sun::Solaris::Exacct::Object 及其派生的所有类的属性在最初通过 new() 创建后都是只读的。设置为只读的属性可以防止无意中修改属性,进而防止产生不一致的目录标记和数据值。对于只读属性,唯一的例外是用于在组对象内存储项的数组。可以使用常规的 perl 数组运算符来修改此数组。

Sun::Solaris::Exacct::Object 常量

Sun::Solaris::Exacct::Object 可提供 EO_ERROREO_NONEEO_ITEMEO_GROUP 常量。

Sun::Solaris::Exacct::Object 函数、类方法和对象方法

Sun::Solaris::Exacct::Object 模块不包含函数。

libexacct(3LIB) API 的 Perl 扩展为 Sun::Solaris::Exacct::Object 提供了以下类方法。

dump

libexacct(3LIB) API 的 Perl 扩展为 Sun::Solaris::Exacct::Object 提供了以下对象方法。

type

catalog

match_catalog

value

Sun::Solaris::Exacct::Object 导出

缺省情况下,此模块中不会导出任何内容。可以使用以下标记有选择性地导入此模块中定义的常量和函数。

标记 

常量或函数 

:CONSTANTS

EO_ERROREO_NONEEO_ITEMEO_GROUP

:ALL

:CONSTANTS

Sun::Solaris::Exacct::Object::Item 模块

Sun::Solaris::Exacct::Object::Item 模块用于 exacct 数据项。exacct 数据项表示为指定属于 Sun::Solaris::Exacct::Object::Item 类(即 Sun::Solaris::Exacct::Object 类的子类)的不透明引用。可按如下方式将基础的 exacct 数据类型映射到 Perl 类型。

表 4–3 映射到 Perl 数据类型的 exacct 数据类型

exacct 类型

Perl 内部类型 

EXT_UINT8

IV(整数) 

EXT_UINT16

IV(整数) 

EXT_UINT32

IV(整数) 

EXT_UINT64

IV(整数) 

EXT_DOUBLE

NV(双精度) 

EXT_STRING

PV(字符串) 

EXT_EXACCT_OBJECT

Sun::Solaris::Exacct::Object 子类

EXT_RAW

PV(字符串) 

Sun::Solaris::Exacct::Object::Item 常量

Sun::Solaris::Exacct::Object::Item 不包含常量。

Sun::Solaris::Exacct::Object::Item 函数、类方法和对象方法

Sun::Solaris::Exacct::Object::Item 不包含函数。

Sun::Solaris::Exacct::Object::Item 可从 Sun::Solaris::Exacct::Object 基类继承所有的类方法以及 new() 类方法。

new

Sun::Solaris::Exacct::Object::Item 可从 Sun::Solaris::Exacct::Object 基类继承所有的对象方法。

Sun::Solaris::Exacct::Object::Item 导出

Sun::Solaris::Exacct::Object::Item 不包含任何导出内容。

Sun::Solaris::Exacct::Object::Group 模块

Sun::Solaris::Exacct::Object::Group 模块用于 exacct 组对象。exacct 组对象表示为指定属于 Sun::Solaris::Exacct::Object::Group 类(即 Sun::Solaris::Exacct::Object 类的子类)的不透明引用。组内的项存储在 Perl 数组中,并且可以通过继承的 value() 方法来访问对数组的引用。这意味着可以使用常规的 Perl 数组语法和运算符来处理组内的各项。该数组的所有数据元素都必须是从 Sun::Solaris::Exacct::Object 类派生的。另外,只能通过添加现有组作为数据项来将组对象彼此嵌套。

Sun::Solaris::Exacct::Object::Group 常量

Sun::Solaris::Exacct::Object::Group 不包含常量。

Sun::Solaris::Exacct::Object::Group 函数、类方法和对象方法

Sun::Solaris::Exacct::Object::Group 不包含函数。

Sun::Solaris::Exacct::Object::Group 可从 Sun::Solaris::Exacct::Object 基类继承所有的类方法以及 new() 类方法。

new

Sun::Solaris::Exacct::Object::Group 可从 Sun::Solaris::Exacct::Object 基类继承所有的对象方法以及 new() 类方法。

as_hash

as_hashlist 

Sun::Solaris::Exacct::Object::Group 导出

Sun::Solaris::Exacct::Object::Group 不包含任何导出内容。

Sun::Solaris::Exacct::Object::_Array 模块

Sun::Solaris::Exacct::Object::_Array 类在内部用于强制对置于 exacct 组中的数据项进行类型检查。Sun::Solaris::Exacct::Object::_Array 不应该由用户直接创建。

Sun::Solaris::Exacct::Object::_Array 常量

Sun::Solaris::Exacct::Object::_Array 不包含常量。

Sun::Solaris::Exacct::Object::_Array 函数、类方法和对象方法

Sun::Solaris::Exacct::Object::_Array 不包含函数。

Sun::Solaris::Exacct::Object::_Array 包含内部使用的类方法。

Sun::Solaris::Exacct::Object::_Array 使用 perl TIEARRAY 方法。

Sun::Solaris::Exacct::Object::_Array 导出

Sun::Solaris::Exacct::Object::_Array不包含任何导出内容。

Perl 代码示例

本节提供用于访问 exacct 文件的 perl 代码示例。


示例 4–1 使用伪代码原型

在典型的使用中,Perl exacct 库用于读取现有的 exacct 文件。使用伪代码可显示各种 Perl exacct 类的关系。在伪代码中说明用于打开和扫描 exacct 文件以及处理所关注对象的进程。在以下伪代码中,为清楚起见使用了“便捷”函数。

-- Open the exacct file ($f is a Sun::Solaris::Exacct::File)

my $f = ea_new_file(...)



-- While not EOF ($o is a Sun::Solaris::Exacct::Object)

while (my $o = $f->get())



        -- Check to see if object is of interest

        if ($o->type() == &EO_ITEM)

             ...



        -- Retrieve the catalog ($c is a Sun::Solaris::Exacct::Catalog)

        $c = $o->catalog()



        -- Retrieve the value

        $v = $o->value();



        -- $v is a reference to a Sun::Solaris::Exacct::Group for a Group

        if (ref($v))

              ....



        -- $v is perl scalar for Items

        else


示例 4–2 递归转储 exacct 对象

sub dump_object

{

    my ($obj, $indent) = @_;

    my $istr = '  ' x $indent;



    #

    # Retrieve the catalog tag.  Because we are doing this in an array

    # context, the catalog tag will be returned as a (type, catalog, id) 

    # triplet, where each member of the triplet will behave as an integer

    # or a string, depending on context.  If instead this next line provided

    # a scalar context, e.g.

    #    my $cat  = $obj->catalog()->value();

    # then $cat would be set to the integer value of the catalog tag.

    #

    my @cat = $obj->catalog()->value();



    #

    # If the object is a plain item

    #

    if ($obj->type() == &EO_ITEM) {

          #

          # Note:  The '%s' formats provide s string context, so the

          # components of the catalog tag will be displayed as the

          # symbolic values.  If we changed the '%s' formats to '%d',

          # the numeric value of the components would be displayed.

          #

          printf("%sITEM\n%s  Catalog = %s|%s|%s\n", 

              $istr, $istr, @cat);

          $indent++;



          #

          # Retrieve the value of the item.  If the item contains in 

          # turn a nested exacct object (i.e. a item or group), then 

          # the value method will return a reference to the appropriate 

          # sort of perl object (Exacct::Object::Item or 

          # Exacct::Object::Group). We could of course figure out that 

          # the item contained a nested item or group by examining 

          # the catalog tag in @cat and looking for a type of 

          # EXT_EXACCT_OBJECT or EXT_GROUP.

          my $val = $obj->value();

          if (ref($val)) {

             # If it is a nested object, recurse to dump it.

             dump_object($val, $indent);

          } else {

             # Otherwise it is just a 'plain' value, so display it.

             printf("%s  Value = %s\n", $istr, $val);

          }



        #

        # Otherwise we know we are dealing with a group.  Groups represent

        # contents as a perl list or array (depending on context), so we 

        # can process the contents of the group with a 'foreach' loop, which

        # provides a list context.  In a list context the value method 

        # returns the content of the group as a perl list, which is the 

        # quickest mechanism, but doesn't allow the group to be modified. 

        # If we wanted to modify the contents of the group we could do so 

        # like this:

        #    my $grp = $obj->value();   # Returns an array reference

        #    $grp->[0] = $newitem;

        # but accessing the group elements this way is much slower.

        #

        } else {

                printf("%sGROUP\n%s  Catalog = %s|%s|%s\n",

                    $istr, $istr, @cat);

                $indent++;

                # 'foreach' provides a list context.

                foreach my $val ($obj->value()) {

                        dump_object($val, $indent);

                }

                printf("%sENDGROUP\n", $istr);

        }

}


示例 4–3 创建新的组记录并写入文件

# Prototype list of catalog tags and values.

my @items = (

   [ &EXT_STRING | &EXC_DEFAULT | &EXD_CREATOR      => "me"         ],

   [ &EXT_UINT32 | &EXC_DEFAULT | &EXD_PROC_PID     => $$           ],

   [ &EXT_UINT32 | &EXC_DEFAULT | &EXD_PROC_UID     => $<           ],

   [ &EXT_UINT32 | &EXC_DEFAULT | &EXD_PROC_GID     => $(           ],

   [ &EXT_STRING | &EXC_DEFAULT | &EXD_PROC_COMMAND => "/bin/stuff" ],

);



# Create a new group catalog object.

my $cat = new_catalog(&EXT_GROUP | &EXC_DEFAULT | &EXD_NONE);



# Create a new Group object and retrieve its data array.

my $group = new_group($cat);

my $ary = $group->value();



# Push the new Items onto the Group array.

foreach my $v (@items) {

        push(@$ary, new_item(new_catalog($v->[0]), $v->[1]));

}



# Nest the group within itself (performs a deep copy).

push(@$ary, $group);



# Dump out the group.

dump_object($group);


示例 4–4 转储 exacct 文件

#!/usr/perl5/5.6.1/bin/perl



use strict;

use warnings;

use blib;

use Sun::Solaris::Exacct qw(:EXACCT_ALL);



die("Usage is dumpexacct 



# Open the exact file and display the header information.

my $ef = ea_new_file($ARGV[0], &O_RDONLY) || die(error_str());

printf("Creator:  %s\n", $ef->creator());

printf("Hostname: %s\n\n", $ef->hostname());



# Dump the file contents

while (my $obj = $ef->get()) {

        ea_dump_object($obj);

}



# Report any errors

if (ea_error() != EXR_OK && ea_error() != EXR_EOF)  {

       printf("\nERROR: %s\n", ea_error_str());

       exit(1);

}

exit(0);

dump 方法的输出

本示例显示了 Sun::Solaris::Exacct::Object->dump() 方法的格式化输出。

GROUP

  Catalog = EXT_GROUP|EXC_DEFAULT|EXD_GROUP_PROC_PARTIAL

  ITEM

    Catalog = EXT_UINT32|EXC_DEFAULT|EXD_PROC_PID

    Value = 3

  ITEM

    Catalog = EXT_UINT32|EXC_DEFAULT|EXD_PROC_UID

    Value = 0

  ITEM

    Catalog = EXT_UINT32|EXC_DEFAULT|EXD_PROC_GID

    Value = 0

  ITEM

    Catalog = EXT_UINT32|EXC_DEFAULT|EXD_PROC_PROJID

    Value = 0

  ITEM

    Catalog = EXT_UINT32|EXC_DEFAULT|EXD_PROC_TASKID

    Value = 0

  ITEM

    Catalog = EXT_UINT64|EXC_DEFAULT|EXD_PROC_CPU_USER_SEC

    Value = 0

  ITEM

    Catalog = EXT_UINT64|EXC_DEFAULT|EXD_PROC_CPU_USER_NSEC

    Value = 0

  ITEM

    Catalog = EXT_UINT64|EXC_DEFAULT|EXD_PROC_CPU_SYS_SEC

    Value = 890

  ITEM

    Catalog = EXT_UINT64|EXC_DEFAULT|EXD_PROC_CPU_SYS_NSEC

    Value = 760000000

  ITEM

    Catalog = EXT_UINT64|EXC_DEFAULT|EXD_PROC_START_SEC

    Value = 1011869897

  ITEM

    Catalog = EXT_UINT64|EXC_DEFAULT|EXD_PROC_START_NSEC

    Value = 380771911

  ITEM

    Catalog = EXT_UINT64|EXC_DEFAULT|EXD_PROC_FINISH_SEC

    Value = 0

  ITEM

    Catalog = EXT_UINT64|EXC_DEFAULT|EXD_PROC_FINISH_NSEC

    Value = 0

  ITEM

    Catalog = EXT_STRING|EXC_DEFAULT|EXD_PROC_COMMAND

    Value = fsflush

  ITEM

    Catalog = EXT_UINT32|EXC_DEFAULT|EXD_PROC_TTY_MAJOR

    Value = 4294967295

  ITEM

    Catalog = EXT_UINT32|EXC_DEFAULT|EXD_PROC_TTY_MINOR

    Value = 4294967295

  ITEM

    Catalog = EXT_STRING|EXC_DEFAULT|EXD_PROC_HOSTNAME

    Value = mower

  ITEM

    Catalog = EXT_UINT64|EXC_DEFAULT|EXD_PROC_FAULTS_MAJOR

    Value = 0

  ITEM

    Catalog = EXT_UINT64|EXC_DEFAULT|EXD_PROC_FAULTS_MINOR

    Value = 0

  ITEM

    Catalog = EXT_UINT64|EXC_DEFAULT|EXD_PROC_MESSAGES_SND

    Value = 0

  ITEM

    Catalog = EXT_UINT64|EXC_DEFAULT|EXD_PROC_MESSAGES_RCV

    Value = 0

  ITEM

    Catalog = EXT_UINT64|EXC_DEFAULT|EXD_PROC_BLOCKS_IN

    Value = 19

  ITEM

    Catalog = EXT_UINT64|EXC_DEFAULT|EXD_PROC_BLOCKS_OUT

    Value = 40833

  ITEM

    Catalog = EXT_UINT64|EXC_DEFAULT|EXD_PROC_CHARS_RDWR

    Value = 0

  ITEM

    Catalog = EXT_UINT64|EXC_DEFAULT|EXD_PROC_CONTEXT_VOL

    Value = 129747

  ITEM

    Catalog = EXT_UINT64|EXC_DEFAULT|EXD_PROC_CONTEXT_INV

    Value = 79

  ITEM

    Catalog = EXT_UINT64|EXC_DEFAULT|EXD_PROC_SIGNALS

    Value = 0

    ITEM

    Catalog = EXT_UINT64|EXC_DEFAULT|EXD_PROC_SYSCALLS

    Value = 0

  ITEM

    Catalog = EXT_UINT32|EXC_DEFAULT|EXD_PROC_ACCT_FLAGS

    Value = 1

  ITEM

    Catalog = EXT_UINT32|EXC_DEFAULT|EXD_PROC_ANCPID

    Value = 0

  ITEM

    Catalog = EXT_UINT32|EXC_DEFAULT|EXD_PROC_WAIT_STATUS

    Value = 0

ENDGROUP