3.5.4. Processing Multiple Elements in an Array
Once you've collected enough information in an array, you will need to retrieve and process all elements in that array to make it useful. Consider
Example 3.14, “vfsreads.stp”: the script collects information about how many VFS reads each process performs, but does not specify what to do with it. The obvious means for making
Example 3.14, “vfsreads.stp” useful is to print the key pairs in the array
reads
, but how?
The best way to process all key pairs in an array (as an iteration) is to use the foreach
statement. Consider the following example:
Example 3.15. cumulative-vfsreads.stp
global reads
probe vfs.read
{
reads[execname()] ++
}
probe timer.s(3)
{
foreach (count in reads)
printf("%s : %d \n", count, reads[count])
}
In the second probe of
Example 3.15, “cumulative-vfsreads.stp”, the
foreach
statement uses the variable
count
to reference each iteration of a unique key in the array
reads
. The
reads[count]
array statement in the same probe retrieves the associated value of each unique key.
Given what we know about the first probe in
Example 3.15, “cumulative-vfsreads.stp”, the script prints VFS-read statistics every 3 seconds, displaying names of processes that performed a VFS-read along with a corresponding VFS-read count.
Now, remember that the
foreach
statement in
Example 3.15, “cumulative-vfsreads.stp” prints
all iterations of process names in the array, and in no particular order. You can instruct the script to process the iterations in a particular order by using
+
(ascending) or
-
(descending). In addition, you can also limit the number of iterations the script needs to process with the
limit value
option.
For example, consider the following replacement probe:
probe timer.s(3)
{
foreach (count in reads- limit 10)
printf("%s : %d \n", count, reads[count])
}
This foreach
statement instructs the script to process the elements in the array reads
in descending order (of associated value). The limit 10
option instructs the foreach
to only process the first ten iterations (i.e. print the first 10, starting with the highest value).