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

📄 pgfault.c

📁 操作系统的一些有用的题目
💻 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 + -