So, this is the output of the code below, Solaris does not fully support getprusage,
it uses /proc instead,
red colors are related, green colors are related, blue has to do with being out of context or being pushed onto the interrupt stack, one of the 44 times it got interrupted/context switched.
System trap time: for .0204900 second - this is how traps (going to kernel mode for example) are handled. This is the time it takes to initiate into kernel mode for 10+ million syscalls. Maybe this is what you mean. Traps also involve signal processing, when the process comes back from a context switch.
appworx> ./tmer
10085397
Resource usage for PID 25360:
LWP ID: 0
Number of LWPs: 1
Timestamp: 5711964.772491400
Creation time: 5711960.622692600
Termination time: 0.0
Real (elapsed) time: 4.149402400
User CPU time: 3.618758600
System CPU time: 0.530350100
System trap CPU time: 0.204900
Text page fault CPU time: 0.0
Data page fault CPU time: 0.0
Kernel page fault CPU time: 0.0
User lock wait time: 0.0
Other sleep time: 0.0
CPU latency time: 0.59100
Stopped time: 0.29700
Minor faults: 0
Major faults: 0
Number of swaps: 0
Input blocks: 0
Output blocks: 0
Messages sent: 0
Messages received: 0
Signals received: 0
Voluntary context switches: 0
Involuntary context switches: 44
System calls: 10085457
Characters read/written: 9
C code
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/resource.h>
#include <time.h>
#ifdef NEED_SNPRINTF
#include <sys/procfs.h>
#else
#include <sys/old_procfs.h>
#endif
#include <limits.h>
int getprusage (pid_t, prusage_t *);
void print_rusage(pid_t, prusage_t *);
void tmer(int, char **);
char dest[64]={0x0};
int main (int argc, char **argv)
{
prusage_t buf;
tmer(argc, argv);
if(getprusage (-1, &buf) == -1)
{
perror("getprusage failed");
exit(1);
}
print_rusage (getpid (), &buf);
return 0;
}
void tmer(int argc, char **argv)
{
size_t add =(argc>1) ? atol(argv[1]): 5;
time_t tm=time(NULL);
double z=0;
tm+=add;
while(time(NULL) < tm) z++;
printf("%.0f\n", z);
return;
}
int getprusage (pid_t pid, prusage_t *pr_usage)
{
int fd;
char name [PATH_MAX];
if (pid == -1)
snprintf (name, PATH_MAX, "/proc/%ld", (long) getpid ());
else
snprintf (name, PATH_MAX, "/proc/%ld", (long) pid);
if ((fd = open (name, O_RDONLY)) == -1)
return (-1);
if (ioctl (fd, PIOCUSAGE, pr_usage) == -1) {
close (fd);
return (-1);
}
else {
close (fd);
return (0);
}
}
void print_rusage (pid_t pid, prusage_t *buf)
{
printf ("Resource usage for PID %ld:\n", (long) pid);
printf (" LWP ID: %ld\n", (long) buf -> pr_lwpid);
printf (" Number of LWPs: %d\n", (int) buf -> pr_count);
printf (" Timestamp: %ld.%ld\n", buf -> pr_tstamp.tv_sec,
buf -> pr_tstamp.tv_nsec);
printf (" Creation time: %ld.%ld\n", buf -> pr_create.tv_sec,
buf -> pr_create.tv_nsec);
printf (" Termination time: %ld.%ld\n", buf -> pr_term.tv_sec,
buf -> pr_term.tv_nsec);
printf (" Real (elapsed) time: %ld.%ld\n", buf -> pr_rtime.tv_sec,
buf -> pr_rtime.tv_nsec);
printf (" User CPU time: %ld.%ld\n", buf -> pr_utime.tv_sec,
buf -> pr_utime.tv_nsec);
printf (" System CPU time: %ld.%ld\n", buf -> pr_stime.tv_sec,
buf -> pr_stime.tv_nsec);
printf (" System trap CPU time: %ld.%ld\n", buf -> pr_ttime.tv_sec,
buf -> pr_ttime.tv_nsec);
printf (" Text page fault CPU time: %ld.%ld\n", buf -> pr_tftime.tv_sec,
buf -> pr_tftime.tv_nsec);
printf (" Data page fault CPU time: %ld.%ld\n", buf -> pr_dftime.tv_sec,
buf -> pr_dftime.tv_nsec);
printf (" Kernel page fault CPU time: %ld.%ld\n", buf -> pr_kftime.tv_sec,
buf -> pr_kftime.tv_nsec);
printf (" User lock wait time: %ld.%ld\n", buf -> pr_ltime.tv_sec,
buf -> pr_ltime.tv_nsec);
printf (" Other sleep time: %ld.%ld\n", buf -> pr_slptime.tv_sec,
buf -> pr_slptime.tv_nsec);
printf (" CPU latency time: %ld.%ld\n", buf -> pr_wtime.tv_sec,
buf -> pr_wtime.tv_nsec);
printf (" Stopped time: %ld.%ld\n", buf -> pr_stoptime.tv_sec,
buf -> pr_stoptime.tv_nsec);
printf (" Minor faults: %ld\n", buf -> pr_minf);
printf (" Major faults: %ld\n", buf -> pr_majf);
printf (" Number of swaps: %ld\n", buf -> pr_nswap);
printf (" Input blocks: %ld\n", buf -> pr_inblk);
printf (" Output blocks: %ld\n", buf -> pr_oublk);
printf (" Messages sent: %ld\n", buf -> pr_msnd);
printf (" Messages received: %ld\n", buf -> pr_mrcv);
printf (" Signals received: %ld\n", buf -> pr_sigs);
printf (" Voluntary context switches: %ld\n", buf -> pr_vctx);
printf (" Involuntary context switches: %ld\n", buf -> pr_ictx);
printf (" System calls: %ld\n", buf -> pr_sysc);
printf (" Characters read/written: %ld\n", buf -> pr_ioch);
return;
}