?? pgfault.c
字號:
#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/time.h>#include <fcntl.h>#include <signal.h>#include <string.h>#include <ctype.h>#define PROCFILE "/proc/stat"#define LINENUMBER 100int fd;int delay = 1;int count = 1;int realcount = 0;int oldpgfault,pgfault;void usage(){ printf("Usage: pgfault [delay [count]]\n"); exit(1);}int getline(char *buf,int buflen){ int i = 0; int ret; char c; while ((ret = read(fd,&c,1)) > 0 && c != '\n') { buf[i] = c; i++; } if (c == '\n') buf[i] = '\0'; return i;}int readfile(){ int len,ret; int i = 0; char buf[LINENUMBER]; char *p,*offset; if ((ret = lseek(fd,0,SEEK_SET)) < 0) { printf("lseek failed\n"); exit(1); } while ((len = getline(buf,LINENUMBER)) > 0) { for (offset = buf; *offset != ' ' && *offset != '\t'; offset++); *offset = '\0'; if (!strcmp(buf,"intr")) { *offset = ' '; while (*offset == ' ') offset++; for (i = 0; i < 16; i++) { p = offset; while (*offset != ' ') offset++; while (*offset == ' ') offset++; } *(offset-1) = '\0'; ret = atoi(p); return ret; } } return -1;}void sig_handler(int signum){ double rate; if (signum == SIGALRM) { if ((pgfault = readfile()) < 0) { printf("pgfault error\n"); exit(1); } else { printf("virtual memory page fault: %d\n",pgfault); realcount++; if (realcount >= count) { rate = (double)(pgfault-oldpgfault)/(double)(delay*count); printf("%d\t%d/\t%d\n",pgfault,oldpgfault,delay*count); printf("pagefault rate %e\n",rate); exit(0); } } }}int main(int argc,char *argv[]){ struct itimerval timer; struct timeval interval,value; int val; switch (argc) { case 1: break; case 2: if ((val = atoi(*(++argv))) > 0) delay = val; else usage(); break; case 3: if ((val = atoi(*(++argv))) > 0) delay = val; else usage(); if ((val = atoi(*(++argv))) > 0) count = val; else usage(); break; default: usage(); } if ((fd = open(PROCFILE,O_RDONLY)) < 0) { printf("open file %s error",PROCFILE); exit(1); } oldpgfault = readfile(); signal(SIGALRM,sig_handler); interval.tv_sec = delay; interval.tv_usec = 0; value.tv_sec = delay; value.tv_usec = 0; timer.it_interval = interval; timer.it_value = value; setitimer(ITIMER_REAL,&timer,NULL); while (1); close(fd); return 0;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -