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

📄 m_aix43.c

📁 查看系统硬件和内存资源使用情况;以及各个进程的使用情况
💻 C
📖 第 1 页 / 共 2 页
字号:
	/* AIX marks all runnable processes as ACTIVE. We want to know	   which processes are sleeping, so check used cpu ticks and adjust	   status field accordingly	 */	if (p->p_stat == SACTIVE && p->p_cpticks == 0)	    p->p_stat = SIDL;        if (pp->pi_state && (sel->system || ((pp->pi_flags & SKPROC) == 0))) {	    total_procs++;	    process_states[p->p_stat]++;	    if ( (pp->pi_state != SZOMB) &&		(sel->idle || p->p_cpticks != 0 || (p->p_stat == SACTIVE))		&& (sel->uid == -1 || pp->pi_uid == (uid_t)sel->uid)) {                *p_pref++ = pp;		active_procs++;	    }	}    }       /* the pref array now holds pointers to the procsinfo structures in     * the p_info array that were selected for display     */    /* sort if requested */    if (compare != NULL)	qsort((char *)pref, active_procs, sizeof (struct procsinfo *), 	      compare);        si->last_pid = -1;		/* no way to figure out last used pid */    si->p_total = total_procs;    si->p_active = pref_len = active_procs;    handle.next_proc = pref;    handle.remaining = active_procs;    return((caddr_t)&handle);}char fmt[128];		/* static area where result is built *//* define what weighted cpu is. use definition of %CPU from 'man ps(1)' */#define weighted_cpu(pp) (PROCTIME(pp) == 0 ? 0.0 : \                        (((PROCTIME(pp)*100.0)/(curtime-pi->pi_start)/ncpus)))#define double_pctcpu(p) ((double)p->p_pctcpu/(double)FLT_MODULO)char *format_next_process(handle, get_userid)    caddr_t handle;    char *(*get_userid)();{    register struct handle *hp;    register struct procsinfo *pi;    register struct proc *p;    char *uname;    long cpu_time;    int proc_size, proc_ress;    char size_unit = 'K';    char ress_unit = 'K';    hp = (struct handle *)handle;    if (hp->remaining == 0) {	/* safe guard */	fmt[0] = '\0';	return fmt;    }    pi = *(hp->next_proc++);    hp->remaining--;    p = &p_proc[PROCMASK(pi->pi_pid)];    cpu_time = PROCTIME(pi);    /* we disply sizes up to 10M in KiloBytes, beyond 10M in MegaBytes */    if ((proc_size = (pi->pi_tsize/1024+pi->pi_dvm)*4) > 10240) {	proc_size /= 1024;	size_unit = 'M';    }    if ((proc_ress = (pi->pi_trss + pi->pi_drss)*4) > 10240) {	proc_ress /= 1024;	ress_unit = 'M';    }    sprintf(fmt, Proc_format ,            pi->pi_pid,					  /* PID */            (*get_userid)(pi->pi_uid),			  /* login name */            getpriority(PRIO_PROCESS, pi->pi_pid),	    EXTRACT_NICE(p),				  /* fixed or vari */            proc_size,					  /* size */            size_unit,					  /* K or M */            proc_ress,					  /* resident */            ress_unit,					  /* K or M */            state_abbrev[p->p_stat],			  /* process state */            format_time(cpu_time),			  /* time used */	    weighted_cpu(pi),	                          /* WCPU */	    100.0 * double_pctcpu(p),                     /* CPU */            printable(pi->pi_comm),                       /* COMM */	    (pi->pi_flags & SKPROC) == 0 ? "" : " (sys)"  /* kernel process? */	    );    return(fmt);}/* *  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). *  	 */getkval(offset, ptr, size, refstr)    unsigned long offset;    caddr_t ptr;    int size;    char *refstr;{    int upper_2gb = 0;    /* reads above 2Gb are done by seeking to offset%2Gb, and supplying     * 1 (opposed to 0) as fourth parameter to readx (see 'man kmem')     */    if (offset > 1<<31) {	upper_2gb = 1;	offset &= 0x7fffffff;    }    if (lseek(kmem, offset, SEEK_SET) != offset) {	fprintf(stderr, "top: lseek failed\n");	quit(2);    }    if (readx(kmem, ptr, size, upper_2gb) != size) {	if (*refstr == '!')	    return 0;	else {	    fprintf(stderr, "top: kvm_read for %s: %s\n", refstr,		    sys_errlist[errno]);	    quit(2);	}    }    return 1 ;}    /* comparison routine for qsort *//* * The following code is taken from the solaris module and adjusted * for AIX -- JV . */#define ORDERKEY_PCTCPU \           if (lresult = p2->p_pctcpu - p1->p_pctcpu, \               (result = lresult > 0 ? 1 : lresult < 0 ? -1 : 0) == 0)#define ORDERKEY_CPTICKS \           if ((result = PROCTIME(pi2) - PROCTIME(pi1)) == 0)#define ORDERKEY_STATE \           if ((result = sorted_state[p2->p_stat]  \                         - sorted_state[p1->p_stat])  == 0)/* Nice values directly reflect the process' priority, and are always >0 ;-) */#define ORDERKEY_PRIO \	   if ((result = EXTRACT_NICE(p1) - EXTRACT_NICE(p2)) == 0) #define ORDERKEY_RSSIZE \           if ((result = PROCRESS(pi2) - PROCRESS(pi1)) == 0)#define ORDERKEY_MEM \           if ((result = PROCSIZE(pi2) - PROCSIZE(pi1)) == 0)static unsigned char sorted_state[] ={    0, /* not used */    0,    0,    0,    3,                          /* sleep */    1,				/* zombie */    4,				/* stop */    6,				/* run */    2,				/* swap */};/* compare_cpu - the comparison function for sorting by cpu percentage */intcompare_cpu(ppi1, ppi2)    struct procsinfo **ppi1;    struct procsinfo **ppi2;{    register struct procsinfo *pi1 = *ppi1, *pi2 = *ppi2;    register struct proc *p1;    register struct proc *p2;    register int result;    register long lresult;    p1 = &p_proc[PROCMASK(pi1->pi_pid)];    p2 = &p_proc[PROCMASK(pi2->pi_pid)];    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(ppi1, ppi2)    struct procsinfo **ppi1;    struct procsinfo **ppi2;{    register struct procsinfo *pi1 = *ppi1, *pi2 = *ppi2;    register struct proc *p1;    register struct proc *p2;    register int result;    register long lresult;    p1 = &p_proc[PROCMASK(pi1->pi_pid)];    p2 = &p_proc[PROCMASK(pi2->pi_pid)];    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(ppi1, ppi2)    struct procsinfo **ppi1;    struct procsinfo **ppi2;{    register struct procsinfo *pi1 = *ppi1, *pi2 = *ppi2;    register struct proc *p1;    register struct proc *p2;    register int result;    register long lresult;    p1 = &p_proc[PROCMASK(pi1->pi_pid)];    p2 = &p_proc[PROCMASK(pi2->pi_pid)];    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(ppi1, ppi2)    struct procsinfo **ppi1;    struct procsinfo **ppi2;{    register struct procsinfo *pi1 = *ppi1, *pi2 = *ppi2;    register struct proc *p1;    register struct proc *p2;    register int result;    register long lresult;    p1 = &p_proc[PROCMASK(pi1->pi_pid)];    p2 = &p_proc[PROCMASK(pi2->pi_pid)];    ORDERKEY_CPTICKS    ORDERKEY_PCTCPU    ORDERKEY_STATE    ORDERKEY_PRIO    ORDERKEY_MEM    ORDERKEY_RSSIZE    ;    return result;}    /* compare_prio - the comparison function for sorting by cpu percentage */intcompare_prio(ppi1, ppi2)    struct procsinfo **ppi1;    struct procsinfo **ppi2;{    register struct procsinfo *pi1 = *ppi1, *pi2 = *ppi2;    register struct proc *p1;    register struct proc *p2;    register int result;    register long lresult;    p1 = &p_proc[PROCMASK(pi1->pi_pid)];    p2 = &p_proc[PROCMASK(pi2->pi_pid)];    ORDERKEY_PRIO    ORDERKEY_PCTCPU    ORDERKEY_CPTICKS    ORDERKEY_STATE    ORDERKEY_RSSIZE    ORDERKEY_MEM    ;    return result;}    proc_owner(pid)int pid;{   int uid;   register struct procsinfo **prefp = pref;   register int cnt = pref_len;   while (--cnt >= 0) {       if ((*prefp)->pi_pid == pid)	   return (*prefp)->pi_uid;       prefp++;   }      return(-1);}

⌨️ 快捷键说明

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