### 23.1 Resource Usage ¶

The function `getrusage` and the data type `struct rusage` are used to examine the resource usage of a process. They are declared in `sys/resource.h`.

Function: `int` getrusage `(int processes, struct rusage *rusage)` ¶

  Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

  This function reports resource usage totals for processes specified by processes, storing the information in `*rusage`.

  In most systems, processes has only two valid values:

  `RUSAGE_SELF` ¶

    Just the current process.

  `RUSAGE_CHILDREN` ¶

    All child processes (direct and indirect) that have already terminated.

  The return value of `getrusage` is zero for success, and `-1` for failure.

  `EINVAL`

    The argument processes is not valid.

One way of getting resource usage for a particular child process is with the function `wait4`, which returns totals for a child when it terminates. See BSD Process Wait Function.

Data Type: struct rusage ¶

  This data type stores various resource usage statistics. It has the following members, and possibly others:

  `struct timeval ru_utime`

    Time spent executing user instructions.

  `struct timeval ru_stime`

    Time spent in operating system code on behalf of processes.

  `long int ru_maxrss`

    The maximum resident set size used, in kilobytes. That is, the maximum number of kilobytes of physical memory that processes used simultaneously.

  `long int ru_ixrss`

    An integral value expressed in kilobytes times ticks of execution, which indicates the amount of memory used by text that was shared with other processes.

  `long int ru_idrss`

    An integral value expressed the same way, which is the amount of unshared memory used for data.

  `long int ru_isrss`

    An integral value expressed the same way, which is the amount of unshared memory used for stack space.

  `long int ru_minflt`

    The number of page faults which were serviced without requiring any I/O.

  `long int ru_majflt`

    The number of page faults which were serviced by doing I/O.

  `long int ru_nswap`

    The number of times processes was swapped entirely out of main memory.

  `long int ru_inblock`

    The number of times the file system had to read from the disk on behalf of processes.

  `long int ru_oublock`

    The number of times the file system had to write to the disk on behalf of processes.

  `long int ru_msgsnd`

    Number of IPC messages sent.

  `long int ru_msgrcv`

    Number of IPC messages received.

  `long int ru_nsignals`

    Number of signals received.

  `long int ru_nvcsw`

    The number of times processes voluntarily invoked a context switch (usually to wait for some service).

  `long int ru_nivcsw`

    The number of times an involuntary context switch took place (because a time slice expired, or another process of higher priority was scheduled).