数组

SystemTap 也支持关联数组,关联数组实现为 hash table 。关联数组包含一组唯一 key 的集合,每个 key 对应一个 value 。

关联数组必需要定义成 global 变量,不管是否在单个或者多个 handler 中使用。如果访问其中的某个元素,语法如下:

array_name[index_expression]

index_expression 可以使用 handler 提供的函数。

使用样例

# Increment the named array slot:
foo [4,"hello"] ++

# Update a statistic:
processusage [uid(),execname()] ++

# Set a timestamp reference point:
times [tid()] = get_cycles()

# Compute a timestamp delta:
delta = get_cycles() - times [tid()]

可以看到,可以使用多个元素组成引用表达式,最多允许9个。每个之间使用 , 分隔。

数组定义

 global ARRAY[<size>]

数组的大小可以在定义时显式的指定。如果没有指定,最大值限定为宏 MAXMAPENTRIES 的大小。

赋值

array_name[index_expression] = value

多次对同一个 index_expression 进行赋值的话,每个都会使用最新的 value 进行替换。

遍历元素

使用 foreach 遍历数组元素,如果索引是单元素,可以使用下面方式遍历。每次循环,count 会更新为当前 key。遍历的顺序是随机的。

foreach (count in reads) { printf("%d\n", reads[count])}

也可以通过指定索引或者值的顺序进行遍历,+ 是升序, - 是降序。 可以使用 limit 限制遍历的数量。

 # 按照索引的升序进行遍历 
 foreach (count+ in reads) { printf("%d\n", reads[count])}

 # 按照值的降序进行遍历 
 foreach (count in reads-) { printf("%d\n", reads[count])}

 # 按照值的降序进行遍历, 并且只处理前10的元素 
 foreach (count in reads- limit 10) { printf("%d\n", reads[count])}

上面介绍的单元素索引,如果索引是多元组的话,使用方式类似。来看些例子:

 # 双元组元素,以随机顺序遍历
 foreach ([a,b] in foo)
    fuss_with(foo[a,b])

 # 以值的升序遍历 
 foreach ([a,b] in foo+) { ... }

 # 以第一个元素的降序遍历
 foreach ([a-,b] in foo) { ... }

 # 以值降序遍历,只处理前10的元素。在这里 v 指的就是 value, 否则通过 foo[i,j] 获取
 foreach (v = [i,j] in foo- limit 10)
    printf("foo[%d,%s] = %d\n", i, j, v)

 # 测试索引是否在数组内
 if ([4,"hello"] in foo) { }

删除元素

使用 delete 删除数组指定的索引或者清空整个数组

 # 删除指定的索引,如果索引不存在,也不会报错
 delete ARRAY[INDEX1, INDEX2, ...]

 # 清空数组 
 delete ARRAY

results matching ""

    No results matching ""