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

📄 m_svr5.c

📁 unix系统下top命令的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
  pctcpu = percent_cpu(pp);  /* format this entry */  (void) sprintf (fmt,		  Proc_format,		  pp->pr_pid,		  (*get_userid) (pp->pr_uid),                  pp->pr_pri,#ifdef SHOW_NICE		  pp->pr_nice,#else	          (u_short)pp->pr_nlwp < 999 ? (u_short)pp->pr_nlwp : 999,#endif	          format_k(SIZE_K(pp)),                   format_k(RSS_K(pp)),  	          (ZOMBIE(pp))  ? state_abbrev[sZOMB]                                 : state_abbrev[pp->pr_state],		  format_time(cputime),		  /* 100.0 * */ pctcpu,		  pp->pr_fname);  /* 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. */intcheck_nlist (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_value == 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). * */intgetkval (	  unsigned long offset,	  int *ptr,	  int size,	  char *refstr){  if (lseek (kmem, (long) offset, 0) == -1)    {      if (*refstr == '!')	refstr++;      (void) fprintf (stderr, "%s: lseek to %s: %s\n",		      myname, refstr, sys_errlist[errno]);      quit (22);    }  if (read (kmem, (char *) ptr, size) == -1)    if (*refstr == '!')      /* we lost the race with the kernel, process isn't in memory */      return (0);    else      {	(void) fprintf (stderr, "%s: reading %s: %s\n",			myname, refstr, sys_errlist[errno]);	quit (23);      }  return (1);}/* ----------------- comparison routines for qsort ---------------- *//* First, the possible comparison keys.  These are defined in such a way   that they can be merely listed in the source code to define the actual   desired ordering. */#define ORDERKEY_PCTCPU  if (dresult = percent_cpu (p2) - percent_cpu (p1),\			     (result = dresult > 0.0 ? 1 : \			     dresult < 0.0 ? -1 : 0) == 0)#define ORDERKEY_CPTICKS if ((result = p2->pr_time.tv_sec - p1->pr_time.tv_sec) == 0)#define ORDERKEY_STATE   if ((result = (long) (sorted_state[p2->pr_state] - \			       sorted_state[p1->pr_state])) == 0)#define ORDERKEY_PRIO    if ((result = p2->pr_pri    - p1->pr_pri)    == 0)#define ORDERKEY_RSSIZE  if ((result = p2->pr_rssize - p1->pr_rssize) == 0)#define ORDERKEY_MEM     if ((result = (p2->pr_size  - p1->pr_size))  == 0)#define ORDERKEY_PID     if ((result = (p2->pr_pid  - p1->pr_pid))  == 0)#define ORDERKEY_UID     if ((result = (p2->pr_uid  - p1->pr_uid))  == 0)#define ORDERKEY_RPID    if ((result = (p1->pr_pid  - p2->pr_pid))  == 0)#define ORDERKEY_RUID    if ((result = (p1->pr_uid  - p2->pr_uid))  == 0)/* states enum {SONPROC, SRUN, SSLEEP, SSTOP, SIDL}  */unsigned char sorted_state[] ={  7,				/* onproc		*/  6,				/* run		        */  5,				/* sleep		*/  4,				/* stop		        */  3,				/* idle			*/  2,				/* zombie		*/  0,				/* unused               */  0				/* unused	        */};#if 0/* *  proc_compare - original singleton 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. */ /* default comparison rtn */intoriginal_proc_compare (	       struct prpsinfo **pp1,	       struct prpsinfo **pp2)  {    register struct prpsinfo *p1;    register struct prpsinfo *p2;    register long result;    double dresult;    /* remove one level of indirection */    p1 = *pp1;    p2 = *pp2;    /* compare percent cpu (pctcpu) */    dresult = percent_cpu(p2) - percent_cpu (p1);    result = dresult > 0.0 ?  1 :             dresult < 0.0 ? -1 : 0;    if (result)    {	/* use cpticks to break the tie */	if ((result = p2->pr_time.tv_sec - p1->pr_time.tv_sec) == 0)	  {	    /* use process state to break the tie */	    if ((result = (long) (sorted_state[p2->pr_state] -				  sorted_state[p1->pr_state])) == 0)	      {		/* use priority to break the tie */		if ((result = p2->pr_pri - p1->pr_pri) == 0)		  {		    /* use resident set size (rssize) to break the tie */		    if ((result = p2->pr_rssize - p1->pr_rssize) == 0)		      {			/* use total memory to break the tie */			result = (p2->pr_size - p1->pr_size);		      }		  }	      }	  }    }    return (result);  }#endif  /* original comparison rtn *//* compare_state - comparison function for sorting by state,pri,time,size */intproc_compare (	       struct prpsinfo **pp1,	       struct prpsinfo **pp2)  {    register struct prpsinfo *p1;    register struct prpsinfo *p2;    register long result;    double dresult;    /* remove one level of indirection */    p1 = *pp1;    p2 = *pp2;    ORDERKEY_STATE    ORDERKEY_PRIO    ORDERKEY_CPTICKS    ORDERKEY_RSSIZE    ORDERKEY_MEM    ORDERKEY_PCTCPU    ;    return (result);  }/* compare_cpu - the comparison function for sorting by cpu % (deflt) */intcompare_cpu (	       struct prpsinfo **pp1,	       struct prpsinfo **pp2)  {    register struct prpsinfo *p1;    register struct prpsinfo *p2;    register long result;    double dresult;    /* remove one level of indirection */    p1 = *pp1;    p2 = *pp2;    ORDERKEY_PCTCPU    ORDERKEY_CPTICKS    ORDERKEY_STATE    ORDERKEY_PRIO    ORDERKEY_RSSIZE    ORDERKEY_MEM    ;    return (result);  }/* compare_size - the comparison function for sorting by total memory usage */intcompare_size (	       struct prpsinfo **pp1,	       struct prpsinfo **pp2)  {    register struct prpsinfo *p1;    register struct prpsinfo *p2;    register long result;    double dresult;    /* remove one level of indirection */    p1 = *pp1;    p2 = *pp2;    ORDERKEY_MEM    ORDERKEY_RSSIZE    ORDERKEY_PCTCPU    ORDERKEY_CPTICKS    ORDERKEY_STATE    ORDERKEY_PRIO    ;    return (result);  }/* compare_res - the comparison function for sorting by resident set size */intcompare_res (	       struct prpsinfo **pp1,	       struct prpsinfo **pp2)  {    register struct prpsinfo *p1;    register struct prpsinfo *p2;    register long result;    double dresult;    /* remove one level of indirection */    p1 = *pp1;    p2 = *pp2;    ORDERKEY_RSSIZE    ORDERKEY_MEM    ORDERKEY_PCTCPU    ORDERKEY_CPTICKS    ORDERKEY_STATE    ORDERKEY_PRIO    ;    return (result);  }/* compare_time - the comparison function for sorting by total cpu time */intcompare_time (	       struct prpsinfo **pp1,	       struct prpsinfo **pp2)  {    register struct prpsinfo *p1;    register struct prpsinfo *p2;    register long result;    double dresult;    /* remove one level of indirection */    p1 = *pp1;    p2 = *pp2;    ORDERKEY_CPTICKS    ORDERKEY_PCTCPU    ORDERKEY_STATE    ORDERKEY_PRIO    ORDERKEY_MEM    ORDERKEY_RSSIZE    ;    return (result);  }/* compare_pid - the comparison function for sorting by pid */intcompare_pid (	       struct prpsinfo **pp1,	       struct prpsinfo **pp2)  {    register struct prpsinfo *p1;    register struct prpsinfo *p2;    register long result;    double dresult;    /* remove one level of indirection */    p1 = *pp1;    p2 = *pp2;    ORDERKEY_PID    ORDERKEY_CPTICKS    ORDERKEY_PCTCPU    ORDERKEY_STATE    ORDERKEY_PRIO    ORDERKEY_MEM    ORDERKEY_RSSIZE    ;    return (result);  }/* compare_uid - the comparison function for sorting by user ID */intcompare_uid (	       struct prpsinfo **pp1,	       struct prpsinfo **pp2)  {    register struct prpsinfo *p1;    register struct prpsinfo *p2;    register long result;    double dresult;    /* remove one level of indirection */    p1 = *pp1;    p2 = *pp2;    ORDERKEY_UID    ORDERKEY_CPTICKS    ORDERKEY_PCTCPU    ORDERKEY_STATE    ORDERKEY_PRIO    ORDERKEY_MEM    ORDERKEY_RSSIZE    ;    return (result);  }/* compare_rpid - the comparison function for sorting by pid ascending */intcompare_rpid (	       struct prpsinfo **pp1,	       struct prpsinfo **pp2)  {    register struct prpsinfo *p1;    register struct prpsinfo *p2;    register long result;    double dresult;    /* remove one level of indirection */    p1 = *pp1;    p2 = *pp2;    ORDERKEY_RPID    ORDERKEY_CPTICKS    ORDERKEY_PCTCPU    ORDERKEY_STATE    ORDERKEY_PRIO    ORDERKEY_MEM    ORDERKEY_RSSIZE    ;    return (result);  }/* compare_uid - the comparison function for sorting by user ID ascending */intcompare_ruid (	       struct prpsinfo **pp1,	       struct prpsinfo **pp2)  {    register struct prpsinfo *p1;    register struct prpsinfo *p2;    register long result;    double dresult;    /* remove one level of indirection */    p1 = *pp1;    p2 = *pp2;    ORDERKEY_RUID    ORDERKEY_CPTICKS    ORDERKEY_PCTCPU    ORDERKEY_STATE    ORDERKEY_PRIO    ORDERKEY_MEM    ORDERKEY_RSSIZE    ;    return (result);  }/* ---------------- helper rtns ---------------- *//* * get process table */voidgetptable (struct prpsinfo *baseptr){  struct prpsinfo *currproc;	/* pointer to current proc structure	*/  int numprocs = 0;  struct dirent *direntp;  currproc = baseptr;  for (rewinddir (procdir); direntp = readdir (procdir);)    {      int fd;      char buf[30];      sprintf(buf,"%s/psinfo", direntp->d_name);      if ((fd = open (buf, O_RDONLY)) < 0)	continue;      if (read(fd, currproc, sizeof(psinfo_t)) != sizeof(psinfo_t))      {	  (void) close (fd);	  continue;      }             numprocs++;      currproc++;            (void) close (fd);      /* Atypical place for growth */      if (numprocs >= maxprocs)       {	    reallocproc(2 * numprocs);	    currproc = (struct prpsinfo *)		    ((char *)baseptr + sizeof(psinfo_t) * numprocs);      }    }  if (nproc != numprocs)    nproc = numprocs;

⌨️ 快捷键说明

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