⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rdwt.h

📁 Linux 的最重要的特徵之一是它的为许多不同的文件系统的支持。这使其非常灵活从而与许多另外的操作系统可以很好的共存。linux采用的是树型结构。最上层是根目录
💻 H
字号:
#include <stdio.h>
#include "structure.h"

unsigned int read(int cfd,char *buf,unsigned int size)
{
	unsigned long off;
	int block,block_off,i,j;
	struct inode *inode;
	char *temp_buf;

	inode=sys_ofile[user[user_id].u_ofile[cfd]].f_inode;
	if(!(sys_ofile[user[user_id].u_ofile[cfd]].f_flag&FREAD))
	{
		printf("\nthe file is not opened for read\n");
		return 0;
	}

	temp_buf=buf;

	off=sys_ofile[user[user_id].u_ofile[cfd]].f_off;
	if((off+size)>inode->di_size) size=inode->di_size-off;

	block_off=off%BLOCKSIZ;
	block=off/BLOCKSIZ;

	if(block_off+size<BLOCKSIZ)
	{
		fseek(fd,DATASTART+inode->di_addr[block]*BLOCKSIZ+block_off,SEEK_SET);
		fread(buf,1,size,fd);
		return size;
	}

	fseek(fd,DATASTART+inode->di_addr[block]*BLOCKSIZ+block_off,SEEK_SET);
	fread(temp_buf,1,BLOCKSIZ-block_off,fd);

	temp_buf+=BLOCKSIZ-block_off;
	j=(inode->di_size-off-block_off)/BLOCKSIZ;
	for(i=0;i<(int)(size-block_off)/BLOCKSIZ;i++)
	{
		fseek(fd,DATASTART+inode->di_addr[j+i]*BLOCKSIZ,SEEK_SET);
		fread(temp_buf,1,BLOCKSIZ,fd);
		temp_buf+=BLOCKSIZ;
	}
	block_off=(size-block_off)%BLOCKSIZ;
	block=inode->di_addr[off+size/BLOCKSIZ+1];
	fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);
	fread(temp_buf,1,block_off,fd);

	sys_ofile[user[user_id].u_ofile[cfd]].f_off+=size;

	return size;
}

unsigned int write(int cfd,char *buf,unsigned int size)
{
	unsigned long off;
	int block,block_off,i;
	struct inode *inode;
	char *temp_buf;
	i=user[user_id].u_ofile[cfd];
	inode=sys_ofile[user[user_id].u_ofile[cfd]].f_inode;
	if(!(sys_ofile[user[user_id].u_ofile[cfd]].f_flag&FWRITE))
	{
		printf("\nthe file is not opened for write\n");
		return 0;
	}
	temp_buf=buf;

	off=sys_ofile[user[user_id].u_ofile[cfd]].f_off;
	block_off=off%BLOCKSIZ;
	block=off/BLOCKSIZ;
	inode->di_addr[block]=balloc();
	if(block_off+size<BLOCKSIZ)
	{
		fseek(fd,DATASTART+inode->di_addr[block]*BLOCKSIZ+block_off,SEEK_SET);
		fwrite(buf,1,size,fd);
		return size;
	}
	fseek(fd,DATASTART+inode->di_addr[block]*BLOCKSIZ+block_off,SEEK_SET);
	fwrite(temp_buf,1,BLOCKSIZ-block_off,fd);

	temp_buf+=BLOCKSIZ-block_off;
	for(i=0;i<(int)(size-block_off)/BLOCKSIZ-1;i++)
	{
		inode->di_addr[block+1+i]=balloc();
		fseek(fd,DATASTART+inode->di_addr[block+1+i]*BLOCKSIZ,SEEK_SET);
		fwrite(temp_buf,1,BLOCKSIZ,fd);
		temp_buf+=BLOCKSIZ;
	}
	//下面是对不够一个block的数据进行处理
	block_off=(size-block_off)%BLOCKSIZ;
	block=inode->di_addr[off+size/BLOCKSIZ+1]=balloc();
	fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);
	fwrite(temp_buf,1,block_off,fd);

	sys_ofile[user[user_id].u_ofile[cfd]].f_off+=size;
	return size;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -