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.