w_getpsent(), w_getpsent64() — Get process data

Standards

Table 1. Standards
Standards / Extensions C or C++ Dependencies
z/OS® UNIX both  

Format

w_getpsent:
#include <sys/ps.h>

int w_getpsent(int token, W_PSPROC *buffptr, size_t length);
w_getpsent64:
#define _LARGE_TIME_API 
#include <sys/ps.h>

int w_getpsent64(int token, W_PSPROC64 *buffptr, size_t length);

Compile requirement: Use of the w_getpsent64 function requires the long long data type. For more information on how to make the long long data type available, see z/OS XL C/C++ Language Reference.

General description

Provides information about the status of any process that the calling process has access to.
token
A relative number that identifies the relative position of a process in the system. Zero represents the first process in the system. On the first call to w_getpsent(), pass the token 0; the function then returns the token that identifies the next process to which the caller has access. Use that token on the next call.
buffptr
The address of the buffer where the data is to be stored.
length
The length of the buffer.
The data returned is described in the ps.h header file. See Table 2 for the format of the structure stored in the buffer.
Table 2. Variables Stored in Structure Returned by w_getpsent() or w_getpsent64()
Variable Type Variable Name General Description
unsigned int ps_state Process state
pid_t ps_pid Process ID
pid_t ps_ppid Parent ID
pid_t ps_sid Session ID (leader)
pid_t ps_pgpid Process group ID
pid_t ps_fgpid Foreground process group ID
uid_t ps_euid Effective user ID
uid_t ps_ruid Real user ID
uid_t ps_suid Saved set user ID
gid_t ps_egid Effective group ID
gid_t ps_rgid Real group ID
gid_t ps_sgid Saved set group ID
long ps_size Total size
time_t 1 ps_starttime Starting time
time64_t 2
clock_t ps_usertime User CPU time
clock_t ps_systime System CPU time
int ps_conttylen Length of ConTTY
char *ps_conttyptr Controlling terminal
int ps_pathlen Length of arg0
char *ps_pathptr File name
int ps_cmdlen Length of command
char *ps_cmdptr Command and arguments
Note:
  1. This variable type is supported by w_getpsent() only.
  2. This variable type is supported by w_getpsent64() only.
Note: The ps_cmdlen and ps_cmdptr elements of W_PSPROC identify the length and location where w_getpsent() is to return the command and arguments used to start the process. As of z/OS V1R11, the maximum length in bytes, including the null terminator, that can be returned is defined by PS_CMDBLEN_LONG. The actual maximum length of the command and arguments returned is PS_CMDBLEN_LONG minus the length of the path. Prior to z/OS V1R11, the maximum length in bytes, including the null terminator, that can be returned is defined by PS_CMDBLEN. The actual maximum length of the command and arguments returned can be less than PS_CMDBLEN and depends on the number of arguments. The system will truncate the command and arguments as needed to allow for the null terminator. Both PS_CMDBLEN_LONG and PS_CMDBLEN are defined in <sys/ps.h>.

Usage notes

  1. ps_usertime reports the user's CPU time consumed for the address space the process is running within. When only one process is running in the address space, this CPU time represents the accumulated user CPU time for that process. When more than one process is running in an address space, the information returned is actually the accumulated CPU time consumed by the address space. It is the sum of the CPU time used by all of the work running in that address space not including the system time.
  2. ps_systime reports the system's CPU time consumed for the address space the process is running within. When only one process is running in the address space, this time represents the accumulated system CPU time for that process. However, when more than one process is running in an address space, the information returned is actually the accumulated system CPU time consumed by all of the work running in the address space.

The w_getpsent64() function behaves exactly like w_getpsent() except it uses struct w_psproc64 instead of struct w_psproc to support time beyond 03:14:07 UTC on January 19, 2038.

Returned value

If successful, w_getpsent() returns the process token for the next process for which the caller has access. For the last active process to which the user has access, w_getpsent() returns 0, indicating there are no more processes to be accessed.

If unsuccessful, w_getpsent() returns -1 and sets errno to one of the following values:
Error Code
Description
EINVAL
An incorrect process token or NULL buffer address was specified.
E2BIG
An insufficient buffer length was provided.
ESRCH
No process can be accessed by the active user.

Example

CELEBW33
/* CELEBW33

   This example provides status information, using wgetpsent().

 */
#define _OPEN_SYS
#include <stdlib.h>
#include <stdio.h>
#include <sys/ps.h>
#include <sys/types.h>
#include <pwd.h>
#include <time.h>
#include <string.h>

int main(void) {
  int token;
  W_PSPROC buf;
  struct passwd *pw;

  token = 0;

  memset(&buf, 0x00, sizeof(buf));
  buf.ps_conttyptr = (char *) malloc(buf.ps_conttylen = PS_CONTTYBLEN);
  buf.ps_pathptr   = (char *) malloc(buf.ps_pathlen   = PS_PATHBLEN);
  buf.ps_cmdptr    = (char *) malloc(buf.ps_cmdlen    = PS_CMDBLEN_LONG);
  if ((buf.ps_conttyptr == NULL) ||
      (buf.ps_pathptr   == NULL) ||
      (buf.ps_cmdptr    == NULL))
    perror("buffer allocation error");

  else do {
    if ((token = w_getpsent(token, &buf, sizeof(buf))) == -1)
      perror("w_getpsent() error");
    else if (token > 0)
      if ((pw = getpwuid(buf.ps_ruid)) == NULL)
        perror("getpwuid() error");
      else printf("token %d: pid %10d, user %8s, started %s", token,
                  (int) buf.ps_pid, pw->pw_name,
                  ctime(&buf.ps_starttime));
  } while (token > 0);
return 0;
}


Output:
token 2: pid     131074, user   MVSUSR1, started Fri Jun 16 08:09:17 2006
token 3: pid      65539, user   MVSUSR1, started Fri Jun 16 08:09:41 2006
token 6: pid     589830, user   MVSUSR1, started Fri Jun 16 10:29:17 2006
token 7: pid     851975, user   MVSUSR1, started Fri Jun 16 10:30:04 2006

Related information