1. /*
  2. * =====================================================================================
  3. *
  4. * Filename: proc_more.c
  5. *
  6. * Description:
  7. *
  8. * Version: 1.0
  9. * Created: 2013年08月07日 11时34分40秒
  10. * Revision: none
  11. * Compiler: gcc
  12. *
  13. * Author: linkscue (scue), linkscue@gmail.com
  14. * Organization:
  15. *
  16. * =====================================================================================
  17. */
  18. #include <stdio.h>
  19. #include <sys/time.h>
  20. #include <sys/types.h>
  21. #include <sys/stat.h>
  22. #include <unistd.h>
  23. #include <fcntl.h>
  24. #include <stdlib.h>
  25. #include <string.h>
  26. void sampleLoadAvg(){
  27. int f=0;
  28. char buffer[80]=""; /* 定义字符串并初始化为'\0' */
  29. char buf[5][10];
  30. char *file="/proc/loadavg";
  31. f = open(file, O_RDONLY);
  32. if (f == 0)
  33. {
  34. printf("error to open: %s\n", file);
  35. exit(EXIT_FAILURE);
  36. }
  37. read(f, (void *)buffer, 80);
  38. sscanf(buffer, "%s %s %s %s %s", /* sscanf()拆分成多个字符串 */
  39. &buf[0],&buf[1],&buf[2],&buf[3],&buf[4]);
  40. printf("一分钟平均负载:%s\n", buf[0]);
  41. printf("五分钟平均负载:%s\n", buf[1]);
  42. printf("一刻钟平均负载:%s\n", buf[2]);
  43. printf("采样时刻的间隔:%s\n", buf[3]);
  44. printf("最大线程的数目:%s\n", buf[4]);
  45. close(f);
  46. }
  47. void sampleTime(){
  48. int f=0;
  49. char buffer[80]="";
  50. char buf[2][10];
  51. float seconds=0;
  52. float secondr=0;
  53. char *file="/proc/uptime";
  54. f = open(file, O_RDONLY);
  55. if (f == 0)
  56. {
  57. printf("error to open: %s\n", file);
  58. exit(EXIT_FAILURE);
  59. }
  60. read(f, (void *)buffer, 80);
  61. sscanf(buffer, "%s %s", &buf[0], &buf[1]);
  62. close(f);
  63. printf("系统运行时间:\t%s秒\n", buf[0]);
  64. printf("系统空闲时间:\t%s秒\n", buf[1]);
  65. close(f);
  66. seconds=strtof(buf[0],NULL);
  67. secondr=strtof(buf[1],NULL);
  68. printf("系统运行时间:\t%03d天%02d时%02d分%02.6f秒\n",
  69. (int)seconds/(24*3600), /* 天 */
  70. ((int)seconds/(3600))%(24), /* 时 */
  71. ((int)seconds/60)%60, /* 分 */
  72. ((int)seconds%60)+(seconds-(int)seconds)); /* 秒(精确至毫秒) */
  73. printf("系统空闲时间:\t%03d天%02d时%02d分%02.6f秒\n",
  74. (int)secondr/(24*3600), /* 天 */
  75. ((int)secondr/(3600))%(24), /* 时 */
  76. ((int)secondr/60)%60, /* 分 */
  77. ((int)secondr%60)+(secondr-(int)secondr)); /* 秒(精确至毫秒) */
  78. }
  79. void sampleKernelVersion(){
  80. int f=0;
  81. char buffer[80]="";
  82. char *file="/proc/sys/kernel/version";
  83. f = open(file, O_RDONLY);
  84. if (f == 0)
  85. {
  86. printf("error to open: %s\n", file);
  87. exit(EXIT_FAILURE);
  88. }
  89. read(f, (void *)buffer, 80);
  90. buffer[strlen(buffer)-1]=0; /* 简单实现tr()函数的功能 */
  91. printf("当前内核版本:\t%s\n", buffer);
  92. close(f);
  93. }
  94. void sampleOsRelease(){
  95. int f=0;
  96. char buffer[80]="";
  97. char *file="/proc/sys/kernel/osrelease";
  98. f = open(file, O_RDONLY);
  99. if (f == 0)
  100. {
  101. printf("error to open: %s\n", file);
  102. exit(EXIT_FAILURE);
  103. }
  104. read(f, (void *)buffer, 80);
  105. buffer[strlen(buffer)-1]=0;
  106. printf("当前发行版本:\t%s\n", buffer);
  107. close(f);
  108. }
  109. void sampleOsType(){
  110. int f=0;
  111. char buffer[80]="";
  112. char *file="/proc/sys/kernel/ostype";
  113. f = open(file, O_RDONLY);
  114. if (f == 0)
  115. {
  116. printf("error to open: %s\n", file);
  117. exit(EXIT_FAILURE);
  118. }
  119. read(f, (void *)buffer, 80);
  120. buffer[strlen(buffer)-1]=0;
  121. printf("当前操作系统:\t%s\n", buffer);
  122. close(f);
  123. }
  124. void sampleDiskStat(){
  125. int i;
  126. FILE *fp;
  127. int nread=0;
  128. ssize_t len = 0;
  129. char *buffer=NULL;
  130. char buf[20][32];
  131. char *file="/proc/diskstats";
  132. char *p;
  133. fp = fopen(file, "rb");
  134. if (fp == NULL)
  135. {
  136. printf("error to open: %s\n", file);
  137. exit(EXIT_FAILURE);
  138. }
  139. printf(" 磁盘 读次数 写次数\n");
  140. while((nread = getline(&buffer, &len, fp)) != -1) { /* 简单实现读行的功能 */
  141. sscanf(buffer, "%04s%08s%s %s %s %s %s %s %s %s %s %s %s %s",
  142. &buf[0],&buf[1],&buf[2],&buf[3],&buf[4],&buf[5],&buf[6],
  143. &buf[7],&buf[8],&buf[9],&buf[10],&buf[11],&buf[12],&buf[13]);
  144. if ((p=strstr(buf[2], "loop"))!=NULL)
  145. {
  146. ; /* loop本地回路不作操作 */
  147. }
  148. else {
  149. printf("%06s%08s%08s\n",
  150. &buf[2],&buf[3], &buf[7]);
  151. }
  152. }
  153. }
  154. void sampleProcesses(void)
  155. {
  156. FILE *fp;
  157. int nread=0;
  158. ssize_t len = 0;
  159. char *buf=NULL;
  160. char *buffer=NULL;
  161. char *file="/proc/stat";
  162. fp = fopen(file, "rb");
  163. if (fp == NULL)
  164. {
  165. printf("error to open: %s\n", file);
  166. exit(EXIT_FAILURE);
  167. }
  168. while((nread = getline(&buffer, &len, fp)) != -1) {
  169. if((buf=strstr(buffer, "processes"))!=NULL) /* 简单实现grep的功能 */
  170. break;
  171. }
  172. buffer[strlen(buffer)-1]=0; /* 简单实现tr()函数的功能 */
  173. char count[16]="";
  174. sscanf(buffer, "%s%s", count, count);
  175. printf("执行线程数目:\t%s\n", count);
  176. }
  177. void sampleContext(void)
  178. {
  179. FILE *fp;
  180. int nread=0;
  181. ssize_t len = 0;
  182. char *buf=NULL;
  183. char *buffer=NULL;
  184. char *file="/proc/stat";
  185. fp = fopen(file, "rb");
  186. if (fp == NULL)
  187. {
  188. printf("error to open: %s\n", file);
  189. exit(EXIT_FAILURE);
  190. }
  191. while((nread = getline(&buffer, &len, fp)) != -1) {
  192. if((buf=strstr(buffer, "ctxt"))!=NULL) /* 简单实现grep的功能 */
  193. break;
  194. }
  195. buffer[strlen(buffer)-1]=0; /* 简单实现tr()函数的功能 */
  196. char count[16]="";
  197. sscanf(buffer, "%s%s", count, count);
  198. printf("上下文切换次数:\t%s\n", count);
  199. }
  200. void sampleMeminfo()
  201. {
  202. FILE *fp;
  203. int nread=0;
  204. ssize_t len = 0;
  205. char *buf=NULL;
  206. char *buffer=NULL;
  207. char *file="/proc/meminfo";
  208. char content[16]="";
  209. fp = fopen(file, "rb");
  210. if (fp == NULL)
  211. {
  212. printf("error to open: %s\n", file);
  213. exit(EXIT_FAILURE);
  214. }
  215. while((nread = getline(&buffer, &len, fp)) != -1) {
  216. if((buf=strstr(buffer, "MemTotal"))!=NULL) /* 简单实现grep的功能 */
  217. {
  218. buffer[strlen(buffer)-1]=0; /* 简单实现tr()函数的功能 */
  219. sscanf(buffer, "%s%s", content, content);
  220. int memtotal_kb=(int)(strtof(content, NULL));
  221. printf("内存总容量:\t%dG%4dM %4dK\n",
  222. memtotal_kb/(1024*1024), /* Gb */
  223. (memtotal_kb/(1024))%1024, /* Mb */
  224. (memtotal_kb%(1024*1024))%1024); /* Kb */
  225. }
  226. if((buf=strstr(buffer, "MemFree"))!=NULL) /* 简单实现grep的功能 */
  227. {
  228. buffer[strlen(buffer)-1]=0; /* 简单实现tr()函数的功能 */
  229. sscanf(buffer, "%s%s", content, content);
  230. int memfree_kb=(int)(strtof(content, NULL));
  231. printf("内存可用容量:\t%dG%4dM %4dK\n",
  232. memfree_kb/(1024*1024), /* Gb */
  233. (memfree_kb/(1024))%1024, /* Mb */
  234. (memfree_kb%(1024*1024))%1024); /* Kb */
  235. }
  236. if((buf=strstr(buffer, "SwapTotal"))!=NULL) /* 简单实现grep的功能 */
  237. {
  238. buffer[strlen(buffer)-1]=0; /* 简单实现tr()函数的功能 */
  239. sscanf(buffer, "%s%s", content, content);
  240. int swaptotal_kb=(int)(strtof(content, NULL));
  241. printf("SWAP总容量:\t%dG%4dM %4dK\n",
  242. swaptotal_kb/(1024*1024), /* Gb */
  243. (swaptotal_kb/(1024))%1024, /* Mb */
  244. (swaptotal_kb%(1024*1024))%1024); /* Kb */
  245. }
  246. if((buf=strstr(buffer, "SwapFree"))!=NULL) /* 简单实现grep的功能 */
  247. {
  248. buffer[strlen(buffer)-1]=0; /* 简单实现tr()函数的功能 */
  249. sscanf(buffer, "%s%s", content, content);
  250. int swapfree_kb=(int)(strtof(content, NULL));
  251. printf("SWAP可用容量:\t%dG%4dM %4dK\n",
  252. swapfree_kb/(1024*1024), /* Gb */
  253. (swapfree_kb/(1024))%1024, /* Mb */
  254. (swapfree_kb%(1024*1024))%1024); /* Kb */
  255. break; /* 所需的信息已满足,退出循环 */
  256. }
  257. }
  258. }
  259. /*
  260. * === FUNCTION ======================================================================
  261. * Name: main
  262. * Description:
  263. * =====================================================================================
  264. */
  265. int main ( int argc, char *argv[] )
  266. {
  267. printf(">>>系统负载<<<\n");
  268. sampleLoadAvg();
  269. printf("----------------------------------------\n");
  270. printf("\n");
  271. printf(">>>运行时间<<<\n");
  272. sampleTime();
  273. printf("\n");
  274. printf(">>>版本信息<<<\n");
  275. sampleOsType();
  276. sampleOsRelease();
  277. sampleKernelVersion();
  278. printf("----------------------------------------\n");
  279. printf("\n");
  280. printf(">>>磁盘信息<<<\n");
  281. sampleDiskStat();
  282. printf("----------------------------------------\n");
  283. printf("\n");
  284. printf(">>>上下文切换<<<\n");
  285. sampleContext();
  286. printf("----------------------------------------\n");
  287. printf("\n");
  288. printf(">>>线程数目<<<\n");
  289. sampleProcesses();
  290. printf("----------------------------------------\n");
  291. printf("\n");
  292. printf(">>>内存信息<<<\n");
  293. sampleMeminfo();
  294. printf("----------------------------------------\n");
  295. return EXIT_SUCCESS;
  296. }

参考文献