Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1299840
  • 博文数量: 554
  • 博客积分: 10425
  • 博客等级: 上将
  • 技术积分: 7555
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-09 09:49
文章分类

全部博文(554)

文章存档

2012年(1)

2011年(1)

2009年(8)

2008年(544)

分类:

2008-04-15 11:28:55


Perl 模块
第4 章• 使用用于扩展记帐的Perl 接口33
表4–1 Perl 模块
模块说明
第35 页中的“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)。
第36 页中的“Sun::Solaris::Task 模块” 提供用于访问任务操作函数settaskid(2) 和
gettaskid(2) 的功能。
第37 页中的“Sun::Solaris::Exacct 模块” 顶层exacct 模块。此模块中的函数可访问与
exacct 有关的系统调用getacct(2)、
putacct(2) 和wracct(2) 以及libexacct(3LIB)
库函数ea_error(3EXACCT)。此模块包含各
种exacct EO_*、EW_*、EXR_*、P_* 和TASK_*
宏的所有常量。
第38 页中的“Sun::Solaris::Exacct::Catalog 模块

提供面向对象的方法,用于访问exacct 目录
标记中的位字段,以及EXC_*、EXD_* 和
EXD_* 宏。
第39 页中的“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)。
第41 页中的“Sun::Solaris::Exacct::Object 模块” 提供面向对象的方法,用于访问单个exacct
记帐文件对象。exacct 对象表示为指定属于
相应Sun::Solaris::Exacct::Object 子类的
不透明引用。此模块可细分为两种可能的对
象类型:项和组。另外,还提供了用于访问
ea_match_object_catalog(3EXACCT)、
ea_attach_to_object(3EXACCT) 函数的方
法。
Perl 模块
34 Solaris 10 资源管理器开发者指南• 2006 年11 月
表4–1 Perl 模块(续)
模块说明
第42 页中的“Sun::Solaris::Exacct::Object::Item
模块”
提供面向对象的方法,用于访问单个exacct
记帐文件项。此类型的对象从
Sun::Solaris::Exacct::Object 中继承。
第43 页中的“Sun::Solaris::Exacct::Object::Group
模块”
提供面向对象的方法,用于访问单个exacct
记帐文件组。此类型的对象从
Sun::Solaris::Exacct::Object 中继承,并
提供了对ea_attach_to_group(3EXACCT) 函
数的访问。组中包含的各项表示为perl 数
组。
第44 页中的
“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)
Perl 模块
第4 章• 使用用于扩展记帐的Perl 接口35
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_TASK、PROJNAME_MAX、PROJF_PATH、PROJECT_BUFSZ、
SETPROJ_ERR、SETPROJ_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 模块不包含对象方法。
Perl 模块
36 Solaris 10 资源管理器开发者指南• 2006 年11 月
Sun::Solaris::Task 导出
缺省情况下,此模块中不会导出任何内容。可以使用以下标记有选择性地导入此模块中定
义的常量和函数。
标记常量或函数
:SYSCALLS settaskid()、gettaskid()
:CONSTANTS TASK_NORMAL 和TASK_FINAL
:ALL :SYSCALLS 和:CONSTANTS
Sun::Solaris::Exacct 模块
Sun::Solaris::Exacct 模块可以为ea_error(3EXACCT) 函数和所有的exacct 系统调用提供
包装。
Sun::Solaris::Exacct 常量
Sun::Solaris::Exacct 模块可提供各种exacct 头文件中的常量。P_PID、P_TASKID、
P_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
Perl 模块
第4 章• 使用用于扩展记帐的Perl 接口37
注– 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_PID、P_TASKID、P_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::Catalog、Sun::Solaris::File、
Sun::Solaris::Object 的:CONSTANTS 标记
:EXACCT_ALL :ALL 以及Sun::Solaris::Catalog、Sun::Solaris::File、
Sun::Solaris::Object 的:ALL 标记
Sun::Solaris::Exacct::Catalog 模块
Sun::Solaris::Exacct::Catalog 模块可以为用作目录标记的32 位整数提供包装。该目录标
记表示为指定属于Sun::Solaris::Exacct::Catalog 类的Perl 对象。可以使用多种方法来处
理目录标记中的字段。
Perl 模块
38 Solaris 10 资源管理器开发者指南• 2006 年11 月
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)
Perl 模块
第4 章• 使用用于扩展记帐的Perl 接口39
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_HEAD、EO_TAIL、EO_NO_VALID_HDR、EO_POSN_MSK 和
EO_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 已忽略如果文件不存在,请创建文件。否则,截断
并打开以便进行读取或写入。
Perl 模块
40 Solaris 10 资源管理器开发者指南• 2006 年11 月
注– $oflags 的唯一有效值是O_RDONLY、O_WRONLY、O_RDWR 或O_CREAT 的组合。$aflags 用于
描述文件中要求对O_RDONLY 进行的定位。允许使用EO_HEAD 或EO_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_HEAD、EO_TAIL、EO_NO_VALID_HDR、EO_POSN_MSK、EO_VALIDATE_MSK。
:ALL :CONSTANTS 和Fcntl(: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_ERROR、EO_NONE、EO_ITEM 和EO_GROUP 常量。
Perl 模块
第4 章• 使用用于扩展记帐的Perl 接口41
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_ERROR、EO_NONE、EO_ITEM 和EO_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(双精度)
Perl 模块
42 Solaris 10 资源管理器开发者指南• 2006 年11 月
表4–3 映射到Perl 数据类型的exacct 数据类型(续)
exacct 类型Perl 内部类型
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() 类方法。
Perl 模块
第4 章• 使用用于扩展记帐的Perl 接口43
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(...)
Perl 代码示例
44 Solaris 10 资源管理器开发者指南• 2006 年11 月
示例4–1 使用伪代码原型(续)
-- 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
{
Perl 代码示例
第4 章• 使用用于扩展记帐的Perl 接口45
示例4–2 递归转储exacct 对象(续)
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.
#
= $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.
Perl 代码示例
46 Solaris 10 资源管理器开发者指南• 2006 年11 月
示例4–2 递归转储exacct 对象(续)
#
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 byexamining
# 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 displayit.
printf("%s Value = %s\n", $istr, $val);
}
Perl 代码示例
第4 章• 使用用于扩展记帐的Perl 接口47
示例4–2 递归转储exacct 对象(续)
#
# 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 modifythe contents of the group we could do so
# like this:
# my$grp = $obj->value(); # Returns an arrayreference
# $grp->[0] = $newitem;
# but accessing the group elements this wayis 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);
}
Perl 代码示例
48 Solaris 10 资源管理器开发者指南• 2006 年11 月
示例4–2 递归转储exacct 对象(续)
}
示例4–3创建新的组记录并写入文件
# Prototype list of catalog tags and values.
= (
[ &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]));
}
Perl 代码示例
第4 章• 使用用于扩展记帐的Perl 接口49
示例4–3 创建新的组记录并写入文件(续)
# 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 displaythe 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);
Perl 代码示例
50 Solaris 10 资源管理器开发者指南• 2006 年11 月
示例4–4 转储exacct 文件(续)
}
# Report anyerrors
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
dump 方法的输出
第4 章• 使用用于扩展记帐的Perl 接口51
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
dump 方法的输出
52 Solaris 10 资源管理器开发者指南• 2006 年11 月
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
dump 方法的输出
第4 章• 使用用于扩展记帐的Perl 接口53
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
dump 方法的输出
54 Solaris 10 资源管理器开发者指南• 2006 年11 月
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
dump 方法的输出
第4 章• 使用用于扩展记帐的Perl 接口55
56
资源控制
本章介绍资源控制及其属性。
 第57 页中的“资源控制概述”
 第58 页中的“资源控制标志和操作”
 第64 页中的“资源控制API 函数”
 第65 页中的“资源控制代码示例”
 第72 页中的“与资源控制关联的编程问题”
资源控制概述
可使用扩展的记帐功能确定系统上的工作负荷所占用的资源。确定占用的资源后,请使用
资源控制功能为资源使用情况设置限制。对资源设置的限制可以防止工作负荷过度占用资
源。
有关资源控制以及用于管理资源控制的示例命令的概述,请参见《System Administration
Guide: Solaris Containers-Resource Management and Solaris Zones》中的第6 章,“Resource
Controls (Overview)”和《System Administration Guide: Solaris Containers-Resource Management
and Solaris Zones》中的第7 章,“Administering Resource Controls (Tasks)”。
资源控制功能可带来以下益处。
 动态设置
可以在系统运行的同时调整资源控制。
 包含级别粒度
资源控制安排在项目、任务或进程的包含级别中。包含级别简化了配置,并使收集到的
值更接近于特定的项目、任务或进程。
 阈值保留
如果尝试将最大值设置为小于实际的资源占用额,则不会对最大值进行任何更改。
5第5 章
57
资源控制标志和操作
本节介绍了与资源控制关联的标志、操作和信号。
rlimit,资源限制
rlimit 是基于进程的。rlimit 可确立对某个进程占用各种系统资源的限制。由该进程创建
的每个进程均从其原始进程继承此资源限制。资源限制由一对值来定义。这些值指定了当
前(软)限制和最大(硬)限制。
进程可能会不可逆转地将其硬限制降为大于或等于软限制的任何值。只有具有超级用户ID
的进程可以提高硬限制。请参见setrlimit() 和getrlimit()。
rlimit 结构包含用于定义软限制和硬限制的两个成员。
rlim_t rlim_cur; /* current (soft) limit */
rlim_t rlim_max /* hard limit */
rctl,资源控制
rctl 通过控制由项目数据库中定义的进程、任务和项目占用的资源来扩大基于进程的
rlimit 限制。
注– 对于设置资源限制,rctl 机制优先于使用rlimit。只有需要跨UNIX 平台的可移植性时
才应使用rlimit 功能。
根据应用程序处理资源控制的方式,应用程序可分为以下几大类。根据执行的操作,可以
进一步对资源控制进行分类。大多数资源控制会报告错误并终止操作。其他资源控制允许
应用程序继续运行并适应资源占用减少的情况。可以为每种资源控制指定以递增的值表示
的渐进操作链。
资源控制的属性列表由权限级别、阈值和超过阈值时执行的操作组成。
资源控制值和权限级别
有关资源控制的每个阈值都必须与以下某种权限级别关联:
RCPRIV_BASIC
权限级别可由调用进程的属主进行修改。RCPRIV_BASIC 与资源的软限制关联。
RCPRIV_PRIVILEGED
权限级别只能由具有权限的(超级用户)调用方进行修改。RCPRIV_PRIVILEGED 与资
源的硬限制关联。
资源控制标志和操作
58 Solaris 10 资源管理器开发者指南• 2006 年11 月
RCPRIV_SYSTEM
权限级别在操作系统实例的持续时间内固定不变。
图5–2 显示用于设置信号权限级别(由/etc/project 文件的process.max-cpu-time 资源控
制定义)的时间线。
局部操作和局部标志
局部操作和局部标志适用于由此资源控制块表示的当前资源控制值。局部操作和局部标志
特定于值。对于为资源控制设置的每个阈值,以下局部操作和局部标志是可用的:
RCTL_LOCAL_NOACTION
超过此资源控制值时,不执行任何局部操作。
RCTL_LOCAL_SIGNAL
指定的信号(由rctlblk_set_local_action() 设置)将被发送到在值序列中设置此资源
控制值的进程。
RCTL_LOCAL_DENY
遇到此资源控制值时,将拒绝对资源的请求。如果为此控制设置了
RCTL_GLOBAL_DENY_ALWAYS,则会对所有值设置该项。如果为此控制设置了
RCTL_GLOBAL_DENY_NEVER,则会对所有值清除该项。
RCTL_LOCAL_MAXIMAL
此资源控制值表示对此控制的最大资源量的请求。如果为此资源控制设置了
RCTL_GLOBAL_INFINITE,则RCTL_LOCAL_MAXIMAL将指示资源控制值没有限制,
永远不会超出。
全局操作和全局标志
全局标志适用于由此资源控制块表示的所有当前资源控制值。全局操作和全局标志是通过
rctladm(1M) 设置的。不能使用setrctl() 设置全局操作和全局标志。全局标志适用于所有
的资源控制。对于为资源控制设置的每个阈值,以下全局操作和全局标志是可用的:
RCTL_GLOBAL_NOACTION
超过有关此控制的资源控制值时,不执行任何全局操作。
RCTL_GLOBAL_SYSLOG
超过序列中与此控制关联的任何资源控制值时,可通过syslog() 功能记录标准消息。
RCTL_GLOBAL_NOBASIC
此控制不允许具有RCPRIV_BASIC 权限的任何值。
RCTL_GLOBAL_LOWERABLE
没有权限的调用方可以降低具有权限的资源控制值中有关此控制的值。
RCTL_GLOBAL_DENY_ALWAYS
超过有关此控制的控制值时执行的操作始终包括拒绝资源。
 
 
 
以上文章转自于 : http://developers.sun.com.cn/
阅读(526) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~