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;
}
上一篇: 如何发起微信群投票 微信群投票发起教程
下一篇: 太尴尬了