发布时间:2014-09-05 17:42:43作者:知识屋
Linux上的/proc目录是一种文件系统,称为proc文件系统(虚拟文件系统),它存储内核状态信息,包括cpu、内存以及进程等信息。proc文件系统有很多优点:应用程序获取内核数据不用切换到内核态,增加了系统的安全性(像ps命令就是通过proc获取进程信息);应用程序可以通过proc直接改变内核参数,这样不用重新编译内核就可以改变和优化内核行为。总之,proc为用户应用程序获取系统内部信息提供了一个安全、方便的界面。proc存在内存中,不占用外存。
下面是/proc目录下的文件:
apm | 高级电源管理信息 |
cmdline | 内核命令行 |
Cpuinfo | 关于 Cpu 信息 |
Devices | 可以用到的设备(块设备/字符设备) |
Dma | Used DMS channels |
Filesystems | 支持的文件系统 |
Interrupts | 中断的使用 |
Ioports | I/O 端口的使用 |
Kcore | 内核核心印象 |
Kmsg | 内核消息 |
Ksyms | 内核符号表 |
Loadavg | 负载均衡 |
Locks | 内核锁 |
Meminfo | 内存信息 |
Misc | Miscellaneous |
Modules | 加载模块列表 |
Mounts | 加载的文件系统 |
Partitions | 系统识别的分区表 |
Rtc | Real time clock |
Slabinfo | Slab pool info |
Stat | 全面统计状态表 |
Swaps | 对换空间的利用情况 |
Version | 内核版本 |
Uptime | 系统正常运行时间 |
下面是我自己写得一个查看cpu和内核版本信息以及启动时间的程序:
因为要涉及文件读写,先介绍一下几个文件读写函数。
1)fgetc从流中读取一个字符,并增加文件指针的位置,常与EOF配合使用,将流中的字符全部读出。
2)putchar向终端输出一个字符。
3)fgets(char *s, int size, FILE *stream),从文件流中读取一行到s中,size一般为数组s的大小,且s以字符'/0'结束。
4)int feof(FILE *stream)判断是否遇到文件结束,如果遇到则返回非零值,否则为0。
5)int fscanf(FILE *stream, const char *format, ...)从文件流(或标准输入)中进行格式化输入,用法如下:
#include<stdio.h>int main(){ int i; char s[5]; fscanf(stdin, "%d %5[a-z]%*s", &i, s); printf("%d %s /n", i, s); return 0; }执行结果(命令行输入99 abcdefghijk,由于fscanf遇到空格和换行时结束,则99存到i,abcde存到s):
#include<stdio.h>#include<sys/time.h>#define LB_SIZE 80enum TYPE{STANDARD, SHORT, LONG};FILE *thisProcFile; //Proc open file pointerstruct timeval now; //system time dateenum TYPE reportType; //the type of observation reportchar repTypeName[16];char *lineBuf; //read out bufferint interval; //system overload detect intervalint duration; //system overload detect durationint iteration;char c1, c2; //character handle uintvoid getTwoTime(FILE *fp) { long uptime, idletime; int day, hour,minute, second; int m, n; char temp[80]; m = n = 0; int ret; int i = 0; char s[100][100]; int j; while((ret=fscanf(fp, "%s", s[i])) != EOF) i++; //print for(j = 0; j < i; j++) { printf("%s/n", s[j]); } uptime = atol(s[0]); idletime = atol(s[1]); printf("<<---------------------___________------------------------->/n"); printf("the uptime of system -----------------------------> %ld/n", uptime); printf("the idletime of process -----------------------------> %ld/n", idletime); printf("<<---------------------___________------------------------->/n"); /* time_t uptime_timet = uptime; printf("xixixixixi%ld/n", uptime_timet); char *result = ctime(&uptime_timet); printf("hahahahahahah %s/n", result);*/ int days; int hours; int minutes; int seconds; //uptime of system days = (int)uptime/86400; hours = (int)uptime%86400/3600; minutes = (int)uptime%3600/60; seconds = (int)uptime%3600%60; printf("the uptime of system-------------days %d----hours %d-----minutes %d-----seconds %d----/n", days, hours, minutes, seconds); //idletime days = (int)idletime/86400; hours = (int)idletime%86400/3600; minutes = (int)idletime%3600/60; seconds = (int)idletime%3600%60; printf("the idletime of system-------------days %d----hours %d-----minutes %d-----seconds %d----/n", days, hours, minutes, seconds);}//get time from startingvoid sampleTime(){ //open timer file FILE *fp; if((fp=fopen("/proc/uptime", "r")) == NULL) { printf("not open /proc/uptime"); exit(0); } getTwoTime(fp); fclose(fp);}void getCPUinfo(){ FILE *cpuinfo; char ch; if((cpuinfo=fopen("/proc/cpuinfo","r")) == NULL) { printf("not open /proc/cpuinfo"); exit(0); } /* while((ch=fgetc(cpuinfo)) != EOF) putchar(ch); fclose(cpuinfo);*/ printf("*********************cpu*******************/n"); while(!feof(cpuinfo)) { fgets(lineBuf, LB_SIZE+1, cpuinfo); printf("%s", lineBuf); } fclose(cpuinfo);}void getKernelVersion() { FILE *version; char ch; if((version=fopen("/proc/version","r")) == NULL) { printf("not open /proc/version"); exit(0); } printf("*****************version*************************/n"); while(!feof(version)) { fgets(lineBuf, LB_SIZE+1, version); printf("%s", lineBuf); } fclose(version);}int main(int argc, char *argv[]) { lineBuf = (char *)malloc(LB_SIZE + 1); reportType = STANDARD; strcpy(repTypeName, "Standard"); if(argc > 1) { sscanf(argv[1], "%c%c", &c1, &c2); if(c1 != '-') exit(1); if(c2 == 'b') { printf("********************************Memory Info*********************************/n"); //open memory info FILE *meminfo; char ch; if((meminfo=fopen("/proc/meminfo","r")) == NULL) { printf("not open /proc/meminfo"); exit(0); } while((ch=fgetc(meminfo)) != EOF) putchar(ch); fclose(meminfo); printf("********************************TIME*********************************/n"); //cat the start time sampleTime(); } else if(c2 == 'c') { //get cpu info and kernel version printf("*************************CPU & kernel*************************/n"); getCPUinfo(); getKernelVersion(); } }}执行:
./main -b 查看内存信息以及经过格式化的启动时间。
./main -c查看cpu类型和kernel版本。
linux一键安装web环境全攻略 在linux系统中怎么一键安装web环境方法
Linux网络基本网络配置方法介绍 如何配置Linux系统的网络方法
Linux下DNS服务器搭建详解 Linux下搭建DNS服务器和配置文件
对Linux进行详细的性能监控的方法 Linux 系统性能监控命令详解
linux系统root密码忘了怎么办 linux忘记root密码后找回密码的方法
Linux基本命令有哪些 Linux系统常用操作命令有哪些
Linux必学的网络操作命令 linux网络操作相关命令汇总
linux系统从入侵到提权的详细过程 linux入侵提权服务器方法技巧
linux系统怎么用命令切换用户登录 Linux切换用户的命令是什么
在linux中添加普通新用户登录 如何在Linux中添加一个新的用户
2012-07-10
CentOS 6.3安装(详细图解教程)
Linux怎么查看网卡驱动?Linux下查看网卡的驱动程序
centos修改主机名命令
Ubuntu或UbuntuKyKin14.04Unity桌面风格与Gnome桌面风格的切换
FEDORA 17中设置TIGERVNC远程访问
StartOS 5.0相关介绍,新型的Linux系统!
解决vSphere Client登录linux版vCenter失败
LINUX最新提权 Exploits Linux Kernel <= 2.6.37
nginx在网站中的7层转发功能