PROC文件的实现

主要就是一个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;

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值