Unable to retrieve information form HP-UX pst_status object
- by bogertron
I am attempting to get process information by using the HP-UX C/C++ library. After scouring the internet, I have discovered that HP-UX has the pstat.h header file which allows programmers to retrieve the process information. After attempting to understand code from the internet hp website, I attempted to create a little test sample to comprehend what the code does.
I attempted to use example 3, however, I ran into several issues. The first issue came when I attempted to execute the following line of code:
(void)printf("pid is %d, command is %s\n", pst[i].pst_pid, pst[i].pst_ucomm);
When I attempted to print the string, I hit a memory fault.
So I decided to attempt to see what the string is and came up with the following:
#include <sys/param.h>
#include <sys/pstat.h>
#include <sys/unistd.h>
#include <string.h>
int main(int argc, char** argv)
{
#define BURST ((size_t)10)
struct pst_status pst[BURST];
int i, count;
int idx = 0; /* index within the context */
int index = 0;
/* loop until count == 0, will occur all have been returned */
while ((count=pstat_getproc(pst, sizeof(pst[0]),BURST,idx))>0)
{
index = 0;
printf("index: %d", index);
/* got count (max of BURST) this time. process them */
while (pst[i].pst_ucomm[index] != '\0')
{
printf("%c", pst[i].pst_ucomm[index]);
index++;
}
printf("\n");
for (i = 0; i < count; i++) {
printf("pid is %d, command is \n", pst[i].pst_pid);
}
/*
* now go back and do it again, using the next index after
* the current 'burst'
*/
idx = pst[count-1].pst_idx + 1;
}
if (count == -1)
perror("pstat_getproc()");
#undef BURST
}
Unfortunately, what happens is that I get the first process printed, then
pid is 2, command is
pid is 2, command is
pid is 2, command is...
I know that I must be doing something foolish since my C/C++ skills are not that great, but I cannot figure out what the issue is since the code is largely copied from the hp website. So here's the question(s) for clarity:
1. Why can't printf("%s", pst[i].pst_ucomm); handle strings?
2. Why can't I iterate over the processes in the system?
Any help is greatly appreciated.