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

📄 vmstat.c

📁 linux下获取一些环境信息的代码
💻 C
📖 第 1 页 / 共 2 页
字号:
////////////////////////////////////////////////////////////////////////////static void diskformat(void){  FILE *fDiskstat;  struct disk_stat *disks;  struct partition_stat *partitions;  unsigned long ndisks,i,j,k;  const char format[]="%-5s %6u %6u %7llu %7u %6u %6u %7llu %7u %6u %6u\n";  if ((fDiskstat=fopen("/proc/diskstats", "rb"))){    fclose(fDiskstat);    ndisks=getdiskstat(&disks,&partitions);    for(k=0; k<ndisks; k++){      if (moreheaders && ((k%height)==0)) diskheader();      printf(format,        disks[k].disk_name,        disks[k].reads,        disks[k].merged_reads,        disks[k].reads_sectors,        disks[k].milli_reading,        disks[k].writes,        disks[k].merged_writes,        disks[k].written_sectors,        disks[k].milli_writing,        disks[k].inprogress_IO?disks[k].inprogress_IO/1000:0,        disks[k].milli_spent_IO?disks[k].milli_spent_IO/1000:0/*,        disks[i].weighted_milli_spent_IO/1000*/      );      fflush(stdout);    }    free(disks);    free(partitions);    for(j=1; j<num_updates; j++){       sleep(sleep_time);      ndisks=getdiskstat(&disks,&partitions);      for(i=0; i<ndisks; i++,k++){        if (moreheaders && ((k%height)==0)) diskheader();        printf(format,          disks[i].disk_name,          disks[i].reads,          disks[i].merged_reads,          disks[i].reads_sectors,          disks[i].milli_reading,          disks[i].writes,          disks[i].merged_writes,          disks[i].written_sectors,          disks[i].milli_writing,          disks[i].inprogress_IO?disks[i].inprogress_IO/1000:0,          disks[i].milli_spent_IO?disks[i].milli_spent_IO/1000:0/*,          disks[i].weighted_milli_spent_IO/1000*/        );        fflush(stdout);      }      free(disks);      free(partitions);    }  }else{    fprintf(stderr, "Your kernel doesn't support diskstat (2.5.70 or above required)\n");     exit(0);  } }////////////////////////////////////////////////////////////////////////////static void slabheader(void){  printf("%-24s %6s %6s %6s %6s\n","Cache","Num", "Total", "Size", "Pages");}////////////////////////////////////////////////////////////////////////////static void slabformat (void){  FILE *fSlab;  struct slab_cache *slabs;  unsigned long nSlab,i,j,k;  const char format[]="%-24s %6u %6u %6u %6u\n";  fSlab=fopen("/proc/slabinfo", "rb");  if(!fSlab){    fprintf(stderr, "Your kernel doesn't support slabinfo.\n");        return;  }  nSlab = getslabinfo(&slabs);  for(k=0; k<nSlab; k++){    if (moreheaders && ((k%height)==0)) slabheader();    printf(format,      slabs[k].name,      slabs[k].active_objs,      slabs[k].num_objs,      slabs[k].objsize,      slabs[k].objperslab    );  }  free(slabs);  for(j=1,k=1; j<num_updates; j++) {     sleep(sleep_time);    nSlab = getslabinfo(&slabs);    for(i=0; i<nSlab; i++,k++){      if (moreheaders && ((k%height)==0)) slabheader();      printf(format,        slabs[i].name,        slabs[i].active_objs,        slabs[i].num_objs,        slabs[i].objsize,        slabs[i].objperslab      );    }    free(slabs);  }}////////////////////////////////////////////////////////////////////////////static void disksum_format(void) {  FILE *fDiskstat;  struct disk_stat *disks;  struct partition_stat *partitions;  int ndisks, i;  unsigned long reads, merged_reads, read_sectors, milli_reading, writes,                merged_writes, written_sectors, milli_writing, inprogress_IO,                milli_spent_IO, weighted_milli_spent_IO;  reads=merged_reads=read_sectors=milli_reading=writes=merged_writes= \  written_sectors=milli_writing=inprogress_IO=milli_spent_IO= \  weighted_milli_spent_IO=0;  if ((fDiskstat=fopen("/proc/diskstats", "rb"))){    fclose(fDiskstat);    ndisks=getdiskstat(&disks, &partitions);    printf("%13d disks \n", ndisks);    printf("%13d partitions \n", getpartitions_num(disks, ndisks));    for(i=0; i<ndisks; i++){         reads+=disks[i].reads;         merged_reads+=disks[i].merged_reads;         read_sectors+=disks[i].reads_sectors;         milli_reading+=disks[i].milli_reading;         writes+=disks[i].writes;         merged_writes+=disks[i].merged_writes;         written_sectors+=disks[i].written_sectors;         milli_writing+=disks[i].milli_writing;         inprogress_IO+=disks[i].inprogress_IO?disks[i].inprogress_IO/1000:0;         milli_spent_IO+=disks[i].milli_spent_IO?disks[i].milli_spent_IO/1000:0;      }    printf("%13lu total reads\n",reads);    printf("%13lu merged reads\n",merged_reads);    printf("%13lu read sectors\n",read_sectors);    printf("%13lu milli reading\n",milli_reading);    printf("%13lu writes\n",writes);    printf("%13lu merged writes\n",merged_writes);    printf("%13lu written sectors\n",written_sectors);    printf("%13lu milli writing\n",milli_writing);    printf("%13lu inprogress IO\n",inprogress_IO);    printf("%13lu milli spent IO\n",milli_spent_IO);    free(disks);    free(partitions);  }}////////////////////////////////////////////////////////////////////////////static void sum_format(void) {  unsigned int running, blocked, btime, processes;  jiff cpu_use, cpu_nic, cpu_sys, cpu_idl, cpu_iow, cpu_xxx, cpu_yyy, cpu_zzz;  unsigned long pgpgin, pgpgout, pswpin, pswpout;  unsigned int intr, ctxt;  meminfo();  getstat(&cpu_use, &cpu_nic, &cpu_sys, &cpu_idl,          &cpu_iow, &cpu_xxx, &cpu_yyy, &cpu_zzz,	  &pgpgin, &pgpgout, &pswpin, &pswpout,	  &intr, &ctxt,	  &running, &blocked,	  &btime, &processes);  printf("%13lu %s total memory\n", unitConvert(kb_main_total),szDataUnit);  printf("%13lu %s used memory\n", unitConvert(kb_main_used),szDataUnit);  printf("%13lu %s active memory\n", unitConvert(kb_active),szDataUnit);  printf("%13lu %s inactive memory\n", unitConvert(kb_inactive),szDataUnit);  printf("%13lu %s free memory\n", unitConvert(kb_main_free),szDataUnit);  printf("%13lu %s buffer memory\n", unitConvert(kb_main_buffers),szDataUnit);  printf("%13lu %s swap cache\n", unitConvert(kb_main_cached),szDataUnit);  printf("%13lu %s total swap\n", unitConvert(kb_swap_total),szDataUnit);  printf("%13lu %s used swap\n", unitConvert(kb_swap_used),szDataUnit);  printf("%13lu %s free swap\n", unitConvert(kb_swap_free),szDataUnit);  printf("%13Lu non-nice user cpu ticks\n", cpu_use);  printf("%13Lu nice user cpu ticks\n", cpu_nic);  printf("%13Lu system cpu ticks\n", cpu_sys);  printf("%13Lu idle cpu ticks\n", cpu_idl);  printf("%13Lu IO-wait cpu ticks\n", cpu_iow);  printf("%13Lu IRQ cpu ticks\n", cpu_xxx);  printf("%13Lu softirq cpu ticks\n", cpu_yyy);  printf("%13Lu stolen cpu ticks\n", cpu_zzz);  printf("%13lu pages paged in\n", pgpgin);  printf("%13lu pages paged out\n", pgpgout);  printf("%13lu pages swapped in\n", pswpin);  printf("%13lu pages swapped out\n", pswpout);  printf("%13u interrupts\n", intr);  printf("%13u CPU context switches\n", ctxt);  printf("%13u boot time\n", btime);  printf("%13u forks\n", processes);}////////////////////////////////////////////////////////////////////////////static void fork_format(void) {  unsigned int running, blocked, btime, processes;  jiff cpu_use, cpu_nic, cpu_sys, cpu_idl, cpu_iow, cpu_xxx, cpu_yyy, cpu_zzz;  unsigned long pgpgin, pgpgout, pswpin, pswpout;  unsigned int intr, ctxt;  getstat(&cpu_use, &cpu_nic, &cpu_sys, &cpu_idl,	  &cpu_iow, &cpu_xxx, &cpu_yyy, &cpu_zzz,	  &pgpgin, &pgpgout, &pswpin, &pswpout,	  &intr, &ctxt,	  &running, &blocked,	  &btime, &processes);  printf("%13u forks\n", processes);}////////////////////////////////////////////////////////////////////////////static int winhi(void) {    struct winsize win;    int rows = 24;     if (ioctl(1, TIOCGWINSZ, &win) != -1 && win.ws_row > 0)      rows = win.ws_row;     return rows;}////////////////////////////////////////////////////////////////////////////int main(int argc, char *argv[]) {  char partition[16];  argc=0; /* redefined as number of integer arguments */  for (argv++;*argv;argv++) {    if ('-' ==(**argv)) {      switch (*(++(*argv))) {          case 'V':	display_version();	exit(0);      case 'd':	statMode |= DISKSTAT;	break;      case 'a':	/* active/inactive mode */	a_option=1;        break;      case 'f':        // FIXME: check for conflicting args	fork_format();        exit(0);      case 'm':        statMode |= SLABSTAT; 		break;      case 'D':        statMode |= DISKSUMSTAT; 		break;      case 'n':	/* print only one header */	moreheaders=FALSE;        break;      case 'p':        statMode |= PARTITIONSTAT;	if (argv[1]){	  char *cp = *++argv;	  if(!memcmp(cp,"/dev/",5)) cp += 5;	  snprintf(partition, sizeof partition, "%s", cp);	}else{	  fprintf(stderr, "-p requires an argument\n");          exit(EXIT_FAILURE);	}        break;      case 'S':	if (argv[1]){	      ++argv;	 	if (!strcmp(*argv, "k")) dataUnit=UNIT_k;	 	else if (!strcmp(*argv, "K")) dataUnit=UNIT_K;	 	else if (!strcmp(*argv, "m")) dataUnit=UNIT_m;	 	else if (!strcmp(*argv, "M")) dataUnit=UNIT_M;		else {fprintf(stderr, "-S requires k, K, m or M (default is kb)\n");		     exit(EXIT_FAILURE);		}		strcpy(szDataUnit, *argv);	 }else {fprintf(stderr, "-S requires an argument\n");		exit(EXIT_FAILURE);	 }	break;      case 's':        statMode |= VMSUMSTAT; 		break;      default:	/* no other aguments defined yet. */	usage();      }   }else{      argc++;      switch (argc) {      case 1:        if ((sleep_time = atoi(*argv)) == 0)         usage();       num_updates = ULONG_MAX;       break;      case 2:        num_updates = atol(*argv);       break;      default:       usage();      } /* switch */  }}  if (moreheaders) {      int tmp=winhi()-3;      height=((tmp>0)?tmp:22);  }      setlinebuf(stdout);  switch(statMode){	case(VMSTAT):        new_format();			     break;	case(VMSUMSTAT):     sum_format();			     break;	case(DISKSTAT):      diskformat();			     break;	case(PARTITIONSTAT): if(diskpartition_format(partition)==-1)                                  printf("Partition was not found\n");			     break;		case(SLABSTAT):      slabformat();			     break;	case(DISKSUMSTAT):   disksum_format();  			     break;		default:	     usage();			     break;  }  return 0;}

⌨️ 快捷键说明

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