欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PROC文件的实现

程序员文章站 2022-06-19 10:58:55
...

主要就是一个proc_read,其他都可根据实验指导书写

// 设备号 光标位置 用户缓存 字数
int proc_read(int dev, unsigned long * pos, char * buf, int count)
{

	struct task_struct ** p;
	//先使用内核缓存 将数据格式化存入proc_buf 再利用put_fs_byte输出到用户态buf
	char* proc_buf = (char *)malloc(sizeof(char)*512); 
	int file_size = 0;

	int total_blocks = 0;
	int free_blocks = 0;
	int total_inodes = 0;
	int used_blocks = 0;
	int i = 0;
	struct super_block * sb;
	int offset=*pos;
	char * db = NULL;
	struct buffer_head * bh;
	int j,k;
	int output_count = 0;

	//psinfo 进程信息
	if(dev == 0)
	{
		file_size=sprintf(proc_buf,"pid\tstate\tfather\tcounter\tstart_time\n");
		for(p = &LAST_TASK; p >= &FIRST_TASK; --p)
		{
			if(*p)
				file_size += sprintf(proc_buf+file_size,"%d\t%d\t%d\t%d\t%d\n",(*p)->pid,(*p)->state,(*p)->father,(*p)->counter,(*p)->start_time);
		}
		*(proc_buf+file_size) = '\0';

	}
	// hdinfo 硬盘信息
	else if(dev == 1)
	{
		sb = get_super(current->root->i_dev);
		total_blocks = sb->s_nzones; // 超级块总数据块数
		total_inodes = sb->s_ninodes; // 超级块总文件块数
		for(i=0;i<sb->s_zmap_blocks;i++) // s_zmap_blocks 数据块位图所占block数
        {
            bh=sb->s_zmap[i];//s_zmap 逻辑块位图在内存中的数组
            db=(char*)bh->b_data;
			// 每个盘块大小是 1024个字节 1个字节8位
            for(j=0;j<1024;j++){
                for(k=1;k<=8;k++){
                        if((used_blocks+free_blocks)>=total_blocks)
                            break;
                        if( *(db+j) & k)
                            used_blocks++;
                        else
                            free_blocks++;
                }
            }
        }

		file_size +=sprintf(proc_buf+file_size,"total_blocks:%d\nfree_blocks:%d\total_inodes:%d\n",total_blocks,free_blocks,total_inodes);
		*(proc_buf+file_size) = '\0';


	}
	while(count>0)
	{
        if(offset>file_size)
            break;
        put_fs_byte(*(proc_buf+offset),buf++);
        offset++;
        output_count++;
        count--;
   }

	//重置文件的pos位置,也就是指向文件末尾的指针
    (*pos)+=output_count; 

    free(proc_buf);
    return output_count;

}