資源簡介
用在嵌入式linux平臺上,通常busybox的top無法看到多線程應(yīng)用的每個(gè)線程的cpu占用率,特地編寫了這個(gè)小工具.
代碼片段和文件信息
/*****************************************************************************/
//?/opt/t500/tools/uclibc/bin/mips-uclibc-gcc?-static?-o?mytop2?mytop2.c
/*
?*??????cpu.c?--?simple?CPU?usage?reporting?tool.
?*
?*??????(C)?Copyright?2000?Greg?Ungerer?(gerg@lineo.com)
?*/
/*****************************************************************************/
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#define?VALID_PROCSTATE?0xa84b62fc
struct?procState
{
????????char?procname[32];
????????FILE?*?fp;
????????int?pid;
????????unsigned?int?utimeold;
????????unsigned?int?utimenew;
????????unsigned?int?stimeold;
????????unsigned?int?stimenew;
????????unsigned?int?allold;
????????unsigned?int?allnew;
????????int?valid;
};
#define?MAX_THREADS_NUM?100
struct?procState?lanProc[MAX_THREADS_NUM];
int?procTotal=0;
char?targetProcName[64]=““;
int?targetProcPid=0;
char?taskName[64]=““;
FILE????????????*taskfp;
FILE????????????*statfp;
char?*version?=?“1.0.0“;
char????????????*procdevice?=?“/proc/stat“;
struct?dirent?*taskdirent;
DIR?*?taskdir;
struct?stats
{
????????unsigned?int????user;
????????unsigned?int????nice;
????????unsigned?int????system;
????????unsigned?int????idle;
????????unsigned?int????total;
};
void?readprocessstat(?void?);
int?getdata(struct?stats?*st)
{
????????unsigned?char???buf[80];
????????int?i;
????????for(i=0;i ????????{
????????????????if?((lanProc[i].fp?=?fopen(lanProc[i].procname“r“))?==?NULL)?{
??????????????????????fprintf(stderr?“ERROR:?failed?errno=%d\n“?errno);
??????????????????????exit(-1);
????????????????}
????????????????fscanf(lanProc[i].fp?“%d?%s?%s?%s?%s?%s?%s?%s?%s?%s?%s?%s?%s?%lu?%lu“?&lanProc[i].pid
???????????????????????&buf[0]&buf[0]&buf[0]&buf[0]&buf[0]&buf[0]&buf[0]&buf[0]&buf[0]&buf[0]&buf[0]&buf[0]
???????????????????????&lanProc[i].utimenew&lanProc[i].stimenew);
fclose(lanProc[i].fp);
????????}
????????if?((statfp?=?fopen(procdevice?“r“))?==?NULL)?{
????????????????fprintf(stderr?“ERROR:?failed?to?open?%s?errno=%d\n“
????????????????????????procdevice?errno);
????????????????exit(0);
????????}
????????fscanf(statfp?“%s?%d?%d?%d?%d“?&buf[0]?&st->user?&st->nice&st->system?&st->idle);
fclose(statfp);
????????st->total?=?st->user?+?st->nice?+?st->system?+?st->idle;
????????for(i=0;i ????????{
????????????????lanProc[i].allnew?=?lanProc[i].utimenew?+?lanProc[i].stimenew;
????????}
????????return(0);
}
void?usage(FILE?*fp?int?rc)
{
????????fprintf(fp?“Usage:?cpu?[-h?ra]?[-s?seconds]?[-c?count]?“
????????????????“[-d?]\n\n“);
????????fprintf(fp?“????????-h?????????????this?help\n“);
評論
共有 條評論