#include #include #include #include #ifdef __FreeBSD__ #include #include #include #include #include #include #endif int main (int ac, char **av) { if (ac != 2) { fprintf(stderr,"Usage: %s pid (0 for current pid)\n",av[0]); exit(0); } int pid; long vsize,rss; pid = strtol(av[1],NULL,10); pid = pid ? pid : getpid(); #ifdef __FreeBSD__ kvm_t *kd; char *err = (char *)malloc(64*sizeof(char)); bzero(err,64); struct kinfo_proc *ki; int pagesize,cnt,size; size = sizeof(pagesize); sysctlbyname("hw.pagesize",&pagesize,&size,NULL,0); kd = kvm_open(getbootfile(),"/dev/null",NULL,O_RDONLY,err); ki = kvm_getprocs(kd,KERN_PROC_PID,pid,&cnt); vsize = ki->ki_size/1024; rss = (ki->ki_rssize*pagesize)/1024; kvm_close(kd); free(err); #else char path[64]; sprintf(path,"/proc/%d/stat",pid); FILE *proc_stat = fopen(path,"r"); if (!proc_stat) return -1; fscanf(proc_stat,"%*d %*s %*c %*d %*d %*d %*d %*d %*u %*u %*u %*u %*u %*u %*u %*d %*d %*d %*d %*d %*d %*u %lu %ld %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*d %*d",&vsize,&rss); fclose(proc_stat); vsize /= 1024; rss *= 4; #endif printf("Memory usage for pid %d:\nVsize: %ld\nRSS: %ld\n",pid,vsize,rss); return 0; }