⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m_netbsd132.c

📁 查看系统硬件和内存资源使用情况;以及各个进程的使用情况
💻 C
📖 第 1 页 / 共 2 页
字号:
    } else {      si->last_pid = -1;    }#else    si->last_pid = -1;#endif}static struct handle handle;caddr_t get_process_info(si, sel, compare)struct system_info *si;struct process_select *sel;int (*compare)();{    register int i;    register int total_procs;    register int active_procs;    register struct kinfo_proc **prefp;    register struct kinfo_proc *pp;    /* these are copied out of sel for speed */    int show_idle;    int show_system;    int show_uid;    int show_command;    pbase = kvm_getprocs(kd, KERN_PROC_ALL, 0, &nproc);    if (nproc > onproc)      pref = (struct kinfo_proc **) realloc(pref, sizeof(struct kinfo_proc              * (onproc = nproc));    if (pref == NULL || pbase == NULL) {      (void) fprintf(stderr, "top: Out of memory.\n");      quit(23);    }    /* get a pointer to the states summary array */    si->procstates = process_states;    /* set up flags which define what we are going to select */    show_idle = sel->idle;    show_system = sel->system;    show_uid = sel->uid != -1;    show_command = sel->command != NULL;    /* count up process states and get pointers to interesting procs */    total_procs = 0;    active_procs = 0;    memset((char *)process_states, 0, sizeof(process_states));    prefp = pref;    for (pp = pbase, i = 0; i < nproc; pp++, i++)    {      /*       *  Place pointers to each valid proc structure in pref[].       *  Process slots that are actually in use have a non-zero       *  status field.  Processes with P_SYSTEM set are system       *  processes---these get ignored unless show_sysprocs is set.       */      if (PP(pp, p_stat) != 0 &&          (show_system || ((PP(pp, p_flag) & P_SYSTEM) == 0)))      {          total_procs++;          process_states[(unsigned char) PP(pp, p_stat)]++;          if ((PP(pp, p_stat) != SZOMB) &&              (show_idle || (PP(pp, p_pctcpu) != 0) ||               (PP(pp, p_stat) == SRUN)) &&              (!show_uid || EP(pp, e_pcred.p_ruid) == (uid_t)sel->uid))          {              *prefp++ = pp;              active_procs++;          }      }    }    /* if requested, sort the "interesting" processes */    if (compare != NULL)    {      qsort((char *)pref, active_procs, sizeof(struct kinfo_proc *),mpare);    }    /* remember active and total counts */    si->p_total = total_procs;    si->p_active = pref_len = active_procs;    /* pass back a handle */    handle.next_proc = pref;    handle.remaining = active_procs;    return((caddr_t)&handle);}char fmt[128];                /* static area where result is built */char *format_next_process(handle, get_userid)caddr_t handle;char *(*get_userid)();{    register struct kinfo_proc *pp;    register long cputime;    register double pct;    struct handle *hp;    /* find and remember the next proc structure */    hp = (struct handle *)handle;    pp = *(hp->next_proc++);    hp->remaining--;    /* get the process's user struct and set cputime */    if ((PP(pp, p_flag) & P_INMEM) == 0) {      /*       * Print swapped processes as <pname>       */      char *comm = PP(pp, p_comm);#define COMSIZ sizeof(PP(pp, p_comm))      char buf[COMSIZ];      (void) strncpy(buf, comm, COMSIZ);      comm[0] = '<';      (void) strncpy(&comm[1], buf, COMSIZ - 2);      comm[COMSIZ - 2] = '\0';      (void) strncat(comm, ">", COMSIZ - 1);      comm[COMSIZ - 1] = '\0';    }#if 0    /* This does not produce the correct results */    cputime = PP(pp, p_uticks) + PP(pp, p_sticks) + PP(pp, p_iticks);#endif    cputime = PP(pp, p_rtime).tv_sec; /* This does not count interrupts */    /* calculate the base for cpu percentages */    pct = pctdouble(PP(pp, p_pctcpu));    /* format this entry */    sprintf(fmt,          Proc_format,          PP(pp, p_pid),          (*get_userid)(EP(pp, e_pcred.p_ruid)),          PP(pp, p_priority) - PZERO,          PP(pp, p_nice) - NZERO,          format_k(pagetok(PROCSIZE(pp))),          format_k(pagetok(VP(pp, vm_rssize))),          state_abbrev[(unsigned char) PP(pp, p_stat)],          format_time(cputime),          10000.0 * weighted_cpu(pct, pp) / hz,          10000.0 * pct / hz,          printable(PP(pp, p_comm)));    /* return the result */    return(fmt);}/* * check_nlist(nlst) - checks the nlist to see if any symbols were not *            found.  For every symbol that was not found, a one-line *            message is printed to stderr.  The routine returns the *            number of symbols NOT found. */static int check_nlist(nlst)register struct nlist *nlst;{    register int i;    /* check to see if we got ALL the symbols we requested */    /* this will write one line to stderr for every symbol not found */    i = 0;    while (nlst->n_name != NULL)    {      if (nlst->n_type == 0)      {          /* this one wasn't found */          (void) fprintf(stderr, "kernel: no symbol named `%s'\n",                         nlst->n_name);          i = 1;      }      nlst++;    }    return(i);}/* *  getkval(offset, ptr, size, refstr) - get a value out of the kernel. *    "offset" is the byte offset into the kernel for the desired value, *    "ptr" points to a buffer into which the value is retrieved, *    "size" is the size of the buffer (and the object to retrieve), *    "refstr" is a reference string used when printing error meessages, *        if "refstr" starts with a '!', then a failure on read will not *        be fatal (this may seem like a silly way to do things, but I *        really didn't want the overhead of another argument). * */static int getkval(offset, ptr, size, refstr)unsigned long offset;int *ptr;int size;char *refstr;{    if (kvm_read(kd, offset, (char *) ptr, size) != size)    {      if (*refstr == '!')      {          return(0);      }      else      {          fprintf(stderr, "top: kvm_read for %s: %s\n",              refstr, strerror(errno));          quit(23);      }    }    return(1);}/* comparison routine for qsort *//* *  proc_compare - comparison function for "qsort" *    Compares the resource consumption of two processes using five *    distinct keys.  The keys (in descending order of importance) are: *    percent cpu, cpu ticks, state, resident set size, total virtual *    memory usage.  The process states are ordered as follows (from least *    to most important):  WAIT, zombie, sleep, stop, start, run.  The *    array declaration below maps a process state index into a number *    that reflects this ordering. */static unsigned char sorted_state[] ={    0,        /* not used             */    3,        /* sleep                */    1,        /* ABANDONED (WAIT)     */    6,        /* run                  */    5,        /* start                */    2,        /* zombie               */    4 /* stop                 */};intproc_compare(pp1, pp2)struct proc **pp1;struct proc **pp2;{    register struct kinfo_proc *p1;    register struct kinfo_proc *p2;    register int result;    register pctcpu lresult;    /* remove one level of indirection */    p1 = *(struct kinfo_proc **) pp1;    p2 = *(struct kinfo_proc **) pp2;    /* compare percent cpu (pctcpu) */    if ((lresult = PP(p2, p_pctcpu) - PP(p1, p_pctcpu)) == 0)    {      /* use cpticks to break the tie */      if ((result = PP(p2, p_cpticks) - PP(p1, p_cpticks)) == 0)      {          /* use process state to break the tie */          if ((result = sorted_state[(unsigned char) PP(p2, p_stat)] -                        sorted_state[(unsigned char) PP(p1, p_stat)])  == 0)          {              /* use priority to break the tie */              if ((result = PP(p2, p_priority) - PP(p1, p_priority)) == 0)              {                  /* use resident set size (rssize) to break the tie */                  if ((result = VP(p2, vm_rssize) - VP(p1, vm_rssize)) == 0)                  {                      /* use total memory to break the tie */                      result = PROCSIZE(p2) - PROCSIZE(p1);                  }              }          }      }    }    else    {      result = lresult < 0 ? -1 : 1;    }    return(result);}/* * proc_owner(pid) - returns the uid that owns process "pid", or -1 if *            the process does not exist. *            It is EXTREMLY IMPORTANT that this function work correctly. *            If top runs setuid root (as in SVR4), then this function *            is the only thing that stands in the way of a serious *            security problem.  It validates requests for the "kill" *            and "renice" commands. */int proc_owner(pid)int pid;{    register int cnt;    register struct kinfo_proc **prefp;    register struct kinfo_proc *pp;    prefp = pref;    cnt = pref_len;    while (--cnt >= 0)    {      pp = *prefp++;      if (PP(pp, p_pid) == (pid_t)pid)      {          return((int)EP(pp, e_pcred.p_ruid));      }    }    return(-1);}#ifdef USE_SWAP/* * swapmode is based on a program called swapinfo written * by Kevin Lahey <kml@rokkaku.atl.ga.us>. */#define       SVAR(var) __STRING(var) /* to force expansion */#define       KGET(idx,r)                                                  \      KGET1(idx, &var, sizeof(var), SVAR(var))#define       KGET1(idx, p, s,g)                                           \      KGET2(nlst[idx].n_value, p, s, msg)#define       KGET2(addr, p, s,g)                                          \      if (kvm_read(kd, (u_long)(addr), p, s) != s)                    \              warnx("cannot read %s: %s", msg, kvm_geterr(kd))#define       KGETRET(addr, p, s,g)                                        \      if (kvm_read(kd, (u_long)(addr), p, s) != s) {                  \              warnx("cannot read %s: %s", msg, kvm_geterr(kd));       \              return (0);                                             \      }intswapmode(){      char *header;      int hlen, nswap, nswdev, dmmax, nswapmap, niswap, niswdev;      int s, e, div, i, l, avail, nfree, npfree, used;      struct swdevt *sw;      long blocksize, *perdev;      struct map *swapmap, *kswapmap;      struct mapent *mp, *freemp;      KGET(VM_NSWAP, nswap);      KGET(VM_NSWDEV, nswdev);      KGET(VM_DMMAX, dmmax);      KGET(VM_NSWAPMAP, nswapmap);      KGET(VM_SWAPMAP, kswapmap);     /* kernel `swapmap' is a pointer */      if ((sw = malloc(nswdev * sizeof(*sw))) == NULL ||          (perdev = malloc(nswdev * sizeof(*perdev))) == NULL ||          (freemp = mp = malloc(nswapmap * sizeof(*mp))) == NULL)              err(1, "malloc");      KGET1(VM_SWDEVT, sw, nswdev * sizeof(*sw), "swdevt");      KGET2((long)kswapmap, mp, nswapmap * sizeof(*mp), "swapmap");      /* Supports sequential swap */      if (nlst[VM_NISWAP].n_value != 0) {              KGET(VM_NISWAP, niswap);              KGET(VM_NISWDEV, niswdev);      } else {              niswap = nswap;              niswdev = nswdev;      }      /* First entry in map is `struct map'; rest are mapent's. */      swapmap = (struct map *)mp;      if (nswapmap != swapmap->m_limit - (struct mapent *)kswapmap)              errx(1, "panic: nswapmap goof");      /* Count up swap space. */      nfree = 0;      memset(perdev, 0, nswdev * sizeof(*perdev));      for (mp++; mp->m_addr != 0; mp++) {              s = mp->m_addr;                 /* start of swap region */              e = mp->m_addr + mp->m_size;    /* end of region */              nfree += mp->m_size;              /*               * Swap space is split up among the configured disks.               *               * For interleaved swap devices, the first dmmax blocks               * of swap space some from the first disk, the next dmmax               * blocks from the next, and so on up to niswap blocks.               *               * Sequential swap devices follow the interleaved devices               * (i.e. blocks starting at niswap) in the order in which               * they appear in the swdev table.  The size of each device               * will be a multiple of dmmax.               *               * The list of free space joins adjacent free blocks,               * ignoring device boundries.  If we want to keep track               * of this information per device, we'll just have to               * extract it ourselves.  We know that dmmax-sized chunks               * cannot span device boundaries (interleaved or sequential)               * so we loop over such chunks assigning them to devices.               */              i = -1;              while (s < e) {         /* XXX this is inefficient */                      int bound = roundup(s+1, dmmax);                      if (bound > e)                              bound = e;                      if (bound <= niswap) {                              /* Interleaved swap chunk. */                              if (i == -1)                                      i = (s / dmmax) % niswdev;                              perdev[i] += bound - s;                              if (++i >= niswdev)                                      i = 0;                      } else {                              /* Sequential swap chunk. */                              if (i < niswdev) {                                      i = niswdev;                                      l = niswap + sw[i].sw_nblks;                              }                              while (s >= l) {                                      /* XXX don't die on bogus blocks */                                      if (i == nswdev-1)                                              break;                                      l += sw[++i].sw_nblks;                              }                              perdev[i] += bound - s;                      }                      s = bound;              }      }      header = getbsize(&hlen, &blocksize);      div = blocksize / 512;      avail = npfree = 0;      for (i = 0; i < nswdev; i++) {              int xsize, xfree;              xsize = sw[i].sw_nblks;              xfree = perdev[i];              used = xsize - xfree;              npfree++;              avail += xsize;      }      /*       * If only one partition has been set up via swapon(8), we don't       * need to bother with totals.       */      used = avail - nfree;      free (sw); free (freemp); free (perdev);      return  (int)(((double)used / (double)avail * 100.0) + 0.5);}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -