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

全部博文(554)

文章存档

2012年(1)

2011年(1)

2009年(8)

2008年(544)

分类:

2008-04-15 11:28:08


访问exacct 文件的C 代码示例
第3 章• 使用用于扩展记帐的C 接口23
示例3–1 显示与指定的pid 对应的exacct 数据(续)
/* Retrieve exacct object and unpack */
getacct(P_PID, pid, buf, bsize);
ea_unpack_object(&scratch, unpk_flag, buf, bsize);
/* Displaythe exacct record */
disp_obj(scratch);
if (scratch->eo_type == EO_GROUP) {
disp_group(scratch);
}
ea_free_object(scratch, unpk_flag);
...
示例3–2确定内核生成期间的各项任务
本示例评估了内核生成并显示了描述此make 任务要生成的那部分源代码树的字符串。显示
正在生成的且在按源目录的分析中有帮助的源代码部分。
本示例的要点包括以下内容:
 要聚合make(可以包括许多进程)的时间,可以将每个make 作为任务来启动。make 子
进程是作为不同的任务来创建的。要跨越makefile 树进行聚合,必须确定父子任务关
系。
 将包含此信息的标记添加到任务的exacct 文件中。添加描述此make 任务要生成的那部
分源代码树的当前工作目录字符串。
ea_set_item(&cwd, EXT_STRING | EXC_LOCAL | MY_CWD,
cwdbuf, strlen(cwdbuf));
...
/* Omit return value checking and error processing */
/* to keep code sample short */
访问exacct 文件的C 代码示例
24 Solaris 10 资源管理器开发者指南• 2006 年11 月
示例3–2 确定内核生成期间的各项任务(续)
ptid = gettaskid(); /* Save "parent" task-id */
tid = settaskid(getprojid(), TASK_NORMAL); /* Create new task */
/* Set data for item objects ptskid and cwd */
ea_set_item(&ptskid, EXT_UINT32 | EXC_LOCAL | MY_PTID, &ptid, 0);
ea_set_item(&cwd, EXT_STRING | EXC_LOCAL | MY_CWD, cwdbuf, strlen(cwdbuf));
/* Set grp object and attach ptskid and cwd to grp */
ea_set_group(&grp, EXT_GROUP | EXC_LOCAL | EXD_GROUP_HEADER);
ea_attach_to_group(&grp, &ptskid);
ea_attach_to_group(&grp, &cwd);
/* Pack the object and put it back into the accounting stream */
ea_buflen = ea_pack_object(&grp, ea_buf, sizeof(ea_buf));
putacct(P_TASKID, tid, ea_buf, ea_buflen, EP_EXACCT_OBJECT);
/* Memorymanagement: free memoryallocate in ea_set_item */
ea_free_item(&cwd, EUP_ALLOC);
...
示例3–3 读取和显示系统exacct 文件的内容
本示例显示如何读取并显示进程或任务的系统exacct 文件。
本示例的要点包括以下内容:
 调用ea_get_object() 以获取该文件中的下一个对象。调用ea_get_object(),循环遍历
exacct 文件,直到遇见EOF。
访问exacct 文件的C 代码示例
第3 章• 使用用于扩展记帐的C 接口25
示例3–3 读取和显示系统exacct 文件的内容(续)
 catalog_name() 使用catalog_item 结构将Solaris 目录的类型ID 转换为有意义的字符
串,该字符串描述了该对象数据的内容。该类型ID 是通过屏蔽最低的24 位(即3 个字
节)获取的。
switch(o->eo_catalog & EXT_TYPE_MASK) {
case EXT_UINT8:
printf(" 8: %u", o->eo_item.ei_uint8);
break;
case EXT_UINT16:
...
}
 TYPE_MASK 的前4 位用于查找列显该对象的实际数据的数据类型。
 disp_group() 将使用指向组对象的指针及该组中的对象个数作为其参数。对于组中的每
个对象,disp_group() 将调用disp_obj() 并递归调用disp_group()(如果该对象是组对
象)。
/* Omit return value checking and error processing */
/* to keep code sample short */
main(int argc, char *argv)
{
ea_file_t ef;
ea_object_t scratch;
char *fname;
fname = argv[1];
ea_open(&ef, fname, NULL, EO_NO_VALID_HDR, O_RDONLY, 0);
bzero(&scratch, sizeof (ea_object_t));
while (ea_get_object(&ef, &scratch) != -1) {
访问exacct 文件的C 代码示例
26 Solaris 10 资源管理器开发者指南• 2006 年11 月
示例3–3 读取和显示系统exacct 文件的内容(续)
disp_obj(&scratch);
if (scratch.eo_type == EO_GROUP)
disp_group(&ef, scratch.eo_group.eg_nobjs);
bzero(&scratch, sizeof (ea_object_t));
}
ea_close(&ef);
}
struct catalog_item { /* convert Solaris catalog’s type ID */
/* to a meaningful string */
int type;
char *name;
} catalog[] = {
{ EXD_VERSION, "version\t" },
...
{ EXD_PROC_PID, " pid\t" },
...
};
static char *
catalog_name(int type)
{
int i = 0;
访问exacct 文件的C 代码示例
第3 章• 使用用于扩展记帐的C 接口27
示例3–3 读取和显示系统exacct 文件的内容(续)
while (catalog[i].type != EXD_NONE) {
if (catalog[i].type == type)
return (catalog[i].name);
else
i++;
}
return ("unknown\t");
}
static void disp_obj(ea_object_t *o)
{
printf("%s\t", catalog_name(o->eo_catalog & 0xffffff));
switch(o->eo_catalog & EXT_TYPE_MASK) {
case EXT_UINT8:
printf(" 8: %u", o->eo_item.ei_uint8);
break;
case EXT_UINT16:
...
}
static void disp_group(ea_file_t *ef, uint_t nobjs)
{
for (i = 0; i < nobjs; i++) {
ea_get_object(ef, &scratch));
访问exacct 文件的C 代码示例
28 Solaris 10 资源管理器开发者指南• 2006 年11 月
示例3–3 读取和显示系统exacct 文件的内容(续)
disp_obj(&scratch);
if (scratch.eo_type == EO_GROUP)
disp_group(ef, scratch.eo_group.eg_nobjs);
}
}
访问exacct 文件的C 代码示例
第3 章• 使用用于扩展记帐的C 接口29
30
使用用于扩展记帐的Perl 接口
Perl 接口可提供与扩展记帐任务和项目的Perl 绑定。使用该接口,Perl 脚本可读取exacct
框架所生成的记帐文件,还可以编写exacct 文件。
本章包含以下主题:
 第31 页中的“扩展记帐概述”
 第44 页中的“Perl 代码示例”
 第51 页中的“dump 方法的输出”
扩展记帐概述
exacct 是Solaris 操作环境的一种新记帐框架,其中除了提供传统SVR4 记帐机制所提供的功
能以外,还提供其他功能。传统的SVR4 记帐具有以下缺点:
 不能修改SVR4 记帐所收集的数据。
不能针对每个应用程序自定义SVR4 记帐所收集的统计信息的类型或数量。SVR4 记帐所
收集的数据更改不适用于使用记帐文件的所有现有应用程序。
 SVR4 记帐机制不是开放的。
应用程序无法在系统记帐数据流中嵌入各自的数据。
 SVR4 记帐机制不具备聚合功能。
Solaris 操作系统会为每个存在的进程写入单独的记录。未提供任何用于将记帐记录集分
组为更高级别聚合的功能。
exacct 框架解除了SVR4 记帐的限制,并且为记帐数据集合提供了可配置、开放且可扩展的
框架。
 可以使用exacct API 配置收集到的数据。
 应用程序既可以在系统记帐文件中嵌入各自的数据,也可以创建和处理各自的自定义记
帐文件。
4第4 章
31
 传统记帐机制中缺少数据聚合功能的问题由任务和项目加以解决。任务标识作为工作单
元的一组进程。通过项目,可将一组用户执行的进程聚集为更高级别的实体。有关任务
和项目的更多详细信息,请参见project(4) 手册页。
有关扩展记帐的更详细概述,请参见《System Administration Guide: Solaris
Containers-Resource Management and Solaris Zones》中的第4 章,“Extended Accounting
(Overview)”。
用于libexacct 的Perl 接口
对象模型
Sun::Solaris::Exacct 模块是由libexacct(3LIB) 库所提供的所有类的父类。
libexacct(3LIB) 提供对以下各种类型的实体的操作:exacct 格式文件、catalog 标记和
exacct 对象。exacct 对象会细分为两种类型。
 项
单个数据值
 组
项列表
使用用于libexacct 的Perl 接口的优点
扩展记帐的Perl 扩展可为基础libexacct(3LIB) API 提供Perl 接口以及以下增强功能。
 与CAPI 完全等效,可提供在功能上与基础CAPI 等效的Perl 接口。
该接口提供了一种无需进行C 编码即可访问的exacct 文件的机制。所有在C 中可以使用
的功能也能借助Perl 接口使用。
 易于使用。
从基础CAPI 获取的数据会表示为Perl 数据类型。Perl 数据类型使数据访问更加容易,
并且无需进行缓冲区压缩和解压缩操作。
 自动内存管理。
CAPI 要求程序员在访问exacct 文件时负责管理内存。内存管理采用的形式是将相应的
标志传递给函数(如ea_unpack_object(3EXACCT))并显式分配传递给API 的缓冲区。
Perl API 取消了这些要求,因为所有的内存管理都由Perl 库执行。
 防止错误地使用API。
ea_object_t 结构提供了exacct 记录在内存中的表示形式。ea_object_t 结构是用于处理
组和项记录的联合类型。因此,类型不正确的结构可能会被传递给某些API 函数。通过
添加类分层结构可防止此类型的编程错误。
用于libexacct 的Perl 接口
32 Solaris 10 资源管理器开发者指南• 2006 年11 月
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 软件包前缀。
 
 
以上文章转自于 : http://developers.sun.com.cn/
阅读(426) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~