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

全部博文(554)

文章存档

2012年(1)

2011年(1)

2009年(8)

2008年(544)

分类:

2008-04-11 15:47:29


字符串比较
第6 章• 字符串87
88
结构和联合
相关变量的集合可以组合成称为结构和联合的复合数据对象。通过为这些对象创建新的类
型定义,可在D中对其进行定义。您可以将新类型用于任何D变量,包括关联的数组值。
本章介绍了用于创建和处理这些复合类型及与其交互的D运算符的语法和语义, 并使用多
个演示DTrace fbt 和pid 提供器用法的示例程序,对结构和联合的语法进行说明。
结构
D关键字struct 为structure 的缩写,用于引入由一组其他类型组成的新类型。新的结构类
型可用作D变量和数组的类型,从而使您可以采用单一名称定义相关变量组。D结构与C
和C++ 中对应的构造相同。如果您采用Java 编程语言编写程序,可将D结构视为只包含数
据成员但不包含方法的类。
我们假定您希望在D中创建一个较为复杂的系统调用跟踪程序,用于记录与shell 执行的每
个read(2) 和write(2) 系统调用有关的多种因素,如已用时间、调用数以及作为参数传递的
最大字节计数。您可以编写一条D子句,在三个单独的关联数组中记录这些属性,如下例
所示:
syscall::read:entry, syscall::write:entry
/pid == 12345/
{
ts[probefunc] = timestamp;
calls[probefunc]++;
maxbytes[probefunc] = arg2 > maxbytes[probefunc] ?
arg2 : maxbytes[probefunc];
7第7 章
89
}
但是,该子句效率很低,因为DTrace 必须创建三个单独的关联数组,并存储与每个数组的
probefunc 对应的同一元组值的各个副本。相反,可以使用结构来节省空间并使程序易于阅
读和维护。首先,在程序源文件顶部声明一个新的结构类型:
struct callinfo {
uint64_t ts; /* timestamp of last syscall entry */
uint64_t elapsed; /* total elapsed time in nanoseconds */
uint64_t calls; /* number of calls made */
size_t maxbytes; /* maximum byte count argument */
};
struct 关键字后跟一个可选标识符,用于引用现在称为struct callinfo 的新类型。然后,
将结构成员括在一组大括号{ } 中,并使用分号(;) 结束整个声明。定义每个结构成员使用
的语法与D变量声明相同,即首先列出成员类型,然后是命名成员的标识符,以及另一个
分号(;)。
结构声明本身仅定义新类型,而不会创建任何变量或在DTrace 中分配存储空间。完成声明
之后,即可在整个D 程序的其余部分将struct callinfo 用作类型,并且每个类型为struct
callinfo 的变量都将存储结构模板描述的四个变量副本。这些成员将根据成员列表按顺序
分配内存,并在成员间引入数据对象对齐所必需的填充空间。
您可以通过"." 运算符编写以下格式的表达式,使用成员标识符名称来访问各成员值:
variable-name.member-name
以下示例为使用新结构类型的改进程序。请转到编辑器并键入以下D程序,然后将其保存
在名为rwinfo.d 的文件中:
示例7–1 rwinfo.d: 收集read(2) 和write(2) 统计信息
struct callinfo {
uint64_t ts; /* timestamp of last syscall entry */
uint64_t elapsed; /* total elapsed time in nanoseconds */
uint64_t calls; /* number of calls made */
size_t maxbytes; /* maximum byte count argument */
结构
90 Solaris 动态跟踪指南• 2006 年7 月
示例7–1 rwinfo.d: 收集read(2) 和write(2) 统计信息(续)
};
struct callinfo i[string]; /* declare i as an associative array */
syscall::read:entry, syscall::write:entry
/pid == $1/
{
i[probefunc].ts = timestamp;
i[probefunc].calls++;
i[probefunc].maxbytes = arg2 > i[probefunc].maxbytes ?
arg2 : i[probefunc].maxbytes;
}
syscall::read:return, syscall::write:return
/i[probefunc].ts != 0 && pid == $1/
{
i[probefunc].elapsed += timestamp - i[probefunc].ts;
}
END
{
printf(" calls max bytes elapsed nsecs\n");
printf("------ ----- --------- -------------\n");
 
以上文章转自于 : http://developers.sun.com.cn/
阅读(449) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~