`
jgsj
  • 浏览: 1051396 次
文章分类
社区版块
存档分类
最新评论

Linux Proc文件系统实验(代码)

 
阅读更多

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 80
enum TYPE{STANDARD, SHORT, LONG};
FILE *thisProcFile; //Proc open file pointer
struct timeval now; //system time date
enum TYPE reportType; //the type of observation report
char repTypeName[16];
char *lineBuf; //read out buffer
int interval; //system overload detect interval
int duration; //system overload detect duration
int iteration;
char c1, c2; //character handle uint

void 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 starting
void 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版本。



分享到:
评论

相关推荐

    哈工大 操作系统实验7 linux0.01proc文件系统实现 代码及相关提交

    这个是07级哈尔滨工业大学操作系统实验的辛勤劳动,下面的压缩包中包含源代码,及实验报告,最好自己搭建平台,本人在电脑中又装了 linux,希望给感兴趣的人看看,呵呵,如果是工大的学弟学妹的话,千万不要顺手牵羊...

    linux 操作系统 GTK /proc文件 系统监视器

    在Linux操作系统中,/proc文件系统是一个非常重要的虚拟文件系统,它提供了查看和修改内核运行时状态的接口。这个特殊的文件系统并不占用磁盘空间,而是动态地反映了当前系统的进程、硬件信息以及各种系统参数。`/...

    哈工大软件学院操作系统实验7——Proc文件系统实现

    操作系统实验7——Proc文件系统实现是哈工大软件学院针对操作系统课程的一项重要实践任务,旨在让学生深入了解和体验Linux内核中的虚拟文件系统Proc。Proc文件系统在Linux中扮演着一个特殊的角色,它不是一个传统的...

    操作系统实验四:统计操作系统缺页次数

    本实验的目的是学习虚拟内存的基本原理和Linux虚拟内存管理技术,深入理解和掌握Linux的按需调页过程,掌握内核模块的概念和操作方法,以及向/proc文件系统中增加文件的方法。同时,综合运用内存管理、系统调用、...

    linux操作系统实验三

    通过这个实验,学生可以深入理解Linux内核如何跟踪和管理缺页中断,以及如何使用/proc文件系统获取系统状态信息。同时,实验还锻炼了编程能力,如处理文件输入输出、信号处理以及时间控制。这有助于增强对操作系统...

    /proc 文件分析

    在 Linux 系统中,/proc 文件系统是一个虚拟文件系统,它提供了对系统硬件和软件信息的访问。通过读取 /proc 文件系统,可以获取到系统的 CPU、内存、进程、磁盘等信息。在本实验中,我们将使用 GTK 图形库来读取 /...

    实验(七)Linux文件系统编程技术 .doc

    实验(七)主要探讨了Linux文件系统编程技术,特别是如何利用`/proc`文件系统来获取系统信息。在Linux系统中,`/proc`是一个特殊的虚拟文件系统,它并不存储在磁盘上,而是直接反映了内核的状态。通过读取`/proc`...

    Linux操作系统实验教程源码.zip

    2. **proc文件系统.rar**:proc文件系统是Linux内核提供的一种虚拟文件系统,它反映了系统运行时的内核状态。在这里,可能包含的是对proc文件系统的操作和分析,例如读取系统信息、监控进程状态、查看网络统计等。...

    实验二 嵌入式linux文件和目录管理实验

    Linux 文件和目录管理是嵌入式 Linux 操作系统中非常重要的一部分,本实验的目的是让学生掌握 Linux 文件和目录管理基本命令、命令重定向和管道操作、熟悉 Linux proc 文件系统的目录结构、掌握 Linux shell 程序的...

    操作系统实验代码

    在本"操作系统实验代码"中,我们主要关注的是如何通过编程来获取计算机的基本信息,特别是计算机名和操作系统的版本号。 首先,让我们深入理解操作系统的基本概念。操作系统(Operating System,简称OS)是一个复杂...

    linux文件系统的移植

    4. **目录结构调整**:在`_install`目录下,创建必要的Linux文件系统目录结构,如`dev`、`etc`、`mnt`、`proc`、`var`、`tmp`和`sys`等。 5. **库文件整合**:将工具链中的`lib`库目录拷贝至`_install`目录,然后...

    构建基本的嵌入式Linux根文件系统.docx

    构建基本的嵌入式 Linux 根文件系统 在构建基本的嵌入式 Linux 根文件...构建基本的嵌入式 Linux 根文件系统需要了解 Linux 文件系统的标准规范、Busybox 的配置和编译、嵌入式 Linux 系统移植和实验和调试等知识点。

    重庆理工大学操作系统基于Linux0.11内核的实践

    在Linux0.11的环境下完成基于内核栈切换的进程切换、地址映射与共享、终端设备的控制、proc文件系统的实现中的三个及以上实验项目。 在Linux四项任务中成功完成了四项:基于内核栈切换的进程切换,终端设备的控制,...

    操作系统课程设计:基于Proc文件系统的进程树打印与内核信息访问

    内容概要:本文介绍了中央民族大学操作系统课程设计的第三次实验,重点在于掌握process系统,并通过编程实现从proc文件系统中获取和展示进程树信息,类似Linux pstree命令的功能。文档首先解释了proc文件系统及其...

    Linux字符设备驱动实验代码

    简单的字符设备的驱动程序,并对所编写的设备驱动程序进行测试,了解Linux操作系统如何管理字符设备。由于网上许多资源不完整,本资源整合了许多内容。包括驱动程序memdev.c,memdev.h,app-mem.c,MakeFile文件。...

    Linux-操作系统内核基本实验

    - **实验2.1 观察Linux行为:** 使用/proc文件系统接口编写程序检查系统负载和进程资源利用率等内核值。 - **实验2.2 内核定时器:** 学习内核定时器的工作原理,并编写程序测量多线程程序的执行时间。 - **实验2.3 ...

    操作系统-文件系统实验-实验08.doc

    2. **了解Linux的/proc文件系统**:/proc文件系统是一个虚拟文件系统,它提供了一种方式来访问内核数据结构。通过读取/proc目录下的文件,可以获取系统状态信息,如CPU时钟速度、内存使用情况等。实验要求学生编写C...

    华科操作系统实验报告.doc

    华科操作系统实验报告 ...本实验报告涵盖了 Linux 操作系统的使用方法、系统调用、设备驱动程序、/proc 文件系统等方面,旨在帮助学生掌握 Linux 操作系统的使用方法和实现方法,并深入了解 Linux 系统内核代码结构。

    实验七Linux文件系统编程技术

    在本实验中,我们将深入探讨Linux文件系统编程技术,特别是如何利用`/proc`文件系统获取系统信息。`/proc`文件系统是一个特殊的虚拟文件系统,它并不存储于磁盘上,而是直接映射到内存中,用于提供对内核状态的实时...

    操作系统实验三:添加内核模块

    理解 proc 文件系统的作用,学习 proc 文件的创建方法,掌握这种用户态和核心态通信的方法。 一、实验目的 学习 Linux 模块的基本概念和原理,学习内核模块编程的基本技术,利用内核模块编程访问进程描述符,操作...

Global site tag (gtag.js) - Google Analytics