DCMD_PROC_INFO

Updated: April 19, 2023

The following information is readily available about the process via the DCMD_PROC_INFO devctl() command:

typedef struct _debug_process_info {
        pid_t      pid;
        pid_t      parent;
        uint32_t   flags;
        uint32_t   umask;
        pid_t      child;
        pid_t      sibling;
        pid_t      pgrp;
        pid_t      sid;
        uint64_t   base_address;
        uint64_t   initial_stack;
        uid_t      uid;
        gid_t      gid;
        uid_t      euid;
        gid_t      egid;
        uid_t      suid;
        gid_t      sgid;
        sigset_t   sig_ignore;
        sigset_t   sig_queue;
        sigset_t   sig_pending;
        uint32_t   num_chancons;
        uint32_t   num_fdcons;
        uint32_t   num_threads;
        uint32_t   num_timers;
        uint64_t   start_time;     /* Start time in nsec */
        uint64_t   utime;          /* User running time in nsec */
        uint64_t   stime;          /* System running time in nsec */
        uint64_t   cutime;         /* terminated children user time in nsec */
        uint64_t   cstime;         /* terminated children user time in nsec */
        uint8_t    priority;       /* process base priority */
        uint8_t    reserved2[7];
        uint8_t    extsched[8];
        uint64_t   pls;            /* Address of process local storage */
        uint64_t   sigstub;        /* Address of process signal trampoline */
        uint64_t   canstub;        /* Address of process thread cancellation trampoline */
        uint64_t   private_mem;    /* Amount of MAP_PRIVATE memory */
        uint32_t   appid;          /* Application id */
        uint32_t   type_id;        /* Security type id */
        uint64_t   reserved[8];
} debug_process_t;

This information is filled into the debug_process_t structure by issuing the DCMD_PROC_INFO devctl(). For details, see its description in the QNX Neutrino Programmer's Guide. Note that the debug_process_t is the same type as procfs_info (via a typedef in <sys/procfs.h>). To get this structure:

void
dump_procfs_info (int fd, int pid)
{
  procfs_info info;
  int         sts;

  sts = devctl (fd, DCMD_PROC_INFO, &info, sizeof (info), NULL);
  if (sts != EOK) {
    fprintf(stderr, "%s: DCMD_PROC_INFO pid %d error %d (%s)\n",
            progname, pid, sts, strerror (sts));
    exit (EXIT_FAILURE);
  }

  // structure is now full, and can be printed, analyzed, etc.
  ...
}

As an example, we'll stick with the pipe process. Here are the contents of the procfs_info structure for the pipe process:

PROCESS ID 4105
Info from DCMD_PROC_INFO
  pid            4105
  parent         2
  flags          0x00000210
  umask          0x00000000
  child          0
  sibling        8
  pgrp           4105
  sid            1
  base_address   0x0000000008048000
  initial_stack  0x0000000008047F18
  uid            0
  gid            0
  euid           0
  egid           0
  suid           0
  sgid           0
  sig_ignore     0x06800000-00000000
  sig_queue      0x00000000-FF000000
  sig_pending    0x00000000-00000000
  num_chancons   4
  num_fdcons     3
  num_threads    4
  num_timers     0
  start_time     0x0EB99001F9CD1EF7
  utime          0x0000000016D3DA23
  stime          0x000000000CDF64E8
  cutime         0x0000000000000000
  cstime         0x0000000000000000
  priority       10

Let's look at the various fields that are present here.