pthonda@bgsuvax.bgsu.edu (Killer B) (04/13/91)
Hi I am trying to read the resource usage of each process in the system . The structure for each process has a pointer to a resource structure.After getting process information, when I try to print its resource usage, I am getting some garbage. Infact the contents of the pointer to resource structure , is 0, or in other words this pointer is pointing to location 0. Could you suggest some method, and also if I want to print for all the processes ,should I check for EOF of file 'kmem'. Thanx in advance Incidentally this is the second time I am posting this article, could somebody guide me. Pratap. Here is the source code for your reference: /*-------------------------------------------------------------------*/ #include <stdio.h> #include <types.h> #include <nlist.h> #include <time.h> #include <sys/resource.h> #include <sys/proc.h> #include <sys/fcntl.h> #include <sys/file.h> #define MAX 10 #define ZERO 0 #define ERROR -1 #define NOERROR 0 #define VMUNIX "/vmunix" #define KMEM "/dev/kmem" #define PTR_KMEM "_proc" int fileDes ; main(argc,argv) int argc ; char *argv[] ; { int ret_cd ; /* Position in Kmem file */ if((ret_cd = posKmem()) == ERROR) { printf("Error in handling Kmem file \n") ; exit(0) ; } /* process Kmem file */ if((ret_cd = proKmem()) == ERROR) { printf("Error in processing Kmem file \n") ; exit(0) ; } /* Close all open files */ close(fileDes) ; } int posKmem() { int ret_cd ; struct nlist nl[2] ; unsigned long proOff ; /* Get _proc address from 'vmunix file in read mode' */ nl[0].n_name = PTR_KMEM ; nl[0].n_type = N_DATA ; nl[1].n_name = (char *) NULL ; if((ret_cd = nlist(VMUNIX,nl)) < ZERO) { perror("Nlist failed") ; return(ERROR) ; } /* Open file 'kmem' in read mode */ if((fileDes = open(KMEM,O_RDONLY)) < ZERO) { perror("Kmem open failed") ; return(ERROR) ; } /* Seek to the offset returned by nlist */ if((ret_cd = lseek(fileDes,nl[0].n_value,L_SET)) < nl[0].n_value) { perror("Lseek failed") ; return(ERROR) ; } if((ret_cd = read(fileDes,(char *) &proOff,sizeof(long))) < ZERO) { perror("Read failed") ; return(ERROR) ; } /* Seek to the offset returned by read */ if((ret_cd = lseek(fileDes,proOff,L_SET)) < proOff) { perror("Lseek failed") ; return(ERROR) ; } return(NOERROR) ; } int proKmem() { char *malloc() ; int ret_cd, ix ; struct proc *ptrProc ; /* Get storage for proc structure */ if((ptrProc = (struct proc *) malloc(sizeof(struct proc))) == (struct proc *) NULL) { perror("Malloc failed") ; return(ERROR) ; } /* Read process structures */ for (ix = 0 ; ix < MAX ; ix++ ) { if((ret_cd = read(fileDes,(char *) ptrProc, sizeof(struct proc))) < sizeof(struct proc)) { perror("Read failed") ; return(ERROR) ; } disPinfo(ptrProc) ; } return(NOERROR) ; } int disPinfo(ps) struct proc *ps ; { struct rusage *ru ; ru = ps->p_ru ; /* ps->p_ru is pointing to location 0 , and I dont know why */ /* Print process info and then the resource usage */ printf("Process Information of process: %d\n" ,ps->p_pid) ; printf("----------------------------------------------------------\n") ; printf("PPID\tP_UID\tP_CPU\tP_GRP\n") ; printf("%hd\t\t%d\t\t%c\t\t%hd\n",ps->p_ppid,ps->p_uid,ps->p_cpu, ps->p_pgrp) ; printf("----------------------------------------------------------\n") ; printf("Resource Information of process: %d\n" ,ps->p_pid) ; printf("----------------------------------------------------------\n") ; printf("Page reclaims\tPage faults\tMessages received\tSignals\n") ; printf("%ld\t\t%ld\t\t%ld\t\t%ld\n\n\n ", ru->ru_minflt, ru->ru_majflt, ru->ru_msgrcv,ru->ru_nsignals); return(NOERROR) ; } /*--------------------E N D O F D A Y ' S P L A Y--------------------------*/
jeff@hpuplca.nsr.hp.com ( Jeff Gruszynski ) (04/16/91)
/ hpuplca:comp.unix.internals / pthonda@bgsuvax.bgsu.edu (Killer B) / 8:53 pm Apr 12, 1991 / > > > int disPinfo(ps) > struct proc *ps ; > { > struct rusage *ru ; > > ru = ps->p_ru ; > > /* ps->p_ru is pointing to location 0 , and I dont know why */ > > /* Print process info and then the resource usage */ > printf("Process Information of process: %d\n" ,ps->p_pid) ; > printf("----------------------------------------------------------\n") ; I would guess the process is swapped out, so the structure is unavailable. (I've only "hacked kernal" once, but my code had to test for this and skip the detailed display routines for swapped out processes. N.B. I'm not a kernal [wl]izard). Jeff Gruszynski Santa Clara Sales Hewlett-Packard