发信人: shixudong()
整理人: yangcs(2000-01-21 09:47:56), 站内信件
|
本人浏览了精华区关于最多可同时打开的文件数的一些讨论,也想发表一些观点
FILES=XX 表示的系统总共能够打开的文件数,而每一个进程系统默认设置为20。
这在进程初试化时由DOS系统在其PSP 中指定,要增加该限制的上限,可以也只能
通过程序修改PSP的相关内容实现(DOS并没有提供未公开的功能调用实现之),
但上限不得超过FILES=XX。tc2.0函数实现如下:
void add_file_handle(unsigned char * handle_table,unsigned int handle_
count)
{
unsigned int psp;
struct HANDLE
{
unsigned int len;
unsigned char far * adr;
};
struct HANDLE far * handle;
_AH=0x62;
geninterrupt(0x21);
psp=_BX;
handle=(struct HANDLE far *)MK_FP(psp,0x0032);
memset(handle_table,0xff,handle_count);
movedata(FP_SEG((void far *)handle->adr),
FP_OFF((void far *)handle->adr),
FP_SEG((void far *)handle_table),
FP_OFF((void far *)handle_table),
handle->len);
handle->len=handle_count;
handle->adr=(unsigned char far *)MK_FP(FP_SEG((void far *)handle_t
able),FP_OFF((void far *)handle_table));
}
函数调用如下:
unsigned char handle_table[30];
add_file_handle(handle_table,sizeof(handle_table));
此处30表示最多可打开30个文件,上限不超过FILES=XX
附:
发信人: netwolf (网络之狼), 信区: DOS
标 题: dos程序段前缀
发信站: 网易虚拟社区 (Thu Dec 30 12:21:28 1999), 站内信件
0h
int 20h 指令
2h
顶层内存段地址
4h
保留
5h
远调用dos调度程序
ah
int 22h 向量
eh
int 23h 向量
12h
int 24h 向量
16h
父程序psp段
18h
系统文件表项
;add by shixudong
其实应叫用户文件表项,即进程初试化时由DOS系统在PSP中设置的20个
表项
默认设置为: 01 01 01 00 02 FF FF FF FF FF
FF FF FF FF FF FF-FF FF FF FF
表示默认打开5个用户文件文件,分别是stdin、stdout、stderr、
stdaux、stdprn,他们占用3个系统文件表项,即con(01)、aux(00)
prn(02)
2ch
环境备分段地址
2eh
dos ss;sp存储区
32h
文件句柄记数区
;add by shixudong
默认设置:0x0014(十进制20)。表示psp+34h所指的表项长度为20。
可修改为新的表项长度。
34h
文件句柄指针
;add by shixudong
默认指向:psp+18h。即用户文件表项。可修改使之指向程序内的内存 区,
用以打开更多的文件数。
38h
share 前psp域
3ch
保留
50h
远调用dos调度程序
52h
保留
5ch
缺省 fcb 1
6ch
缺省 fcb 2
7ch
保留
80h
命令行字节长度
81h
命令行
ffh
;add by shixudong
由上可见,通过修改psp+32h和psp+34h处的值即可增加打开的文件数。最后,
别忘了将原psp+18h处的20项复制到新地方,超过20项的地方置ff(表示尚未打开
)
-- [email protected]
※ 修改:.shixudong 于 Jan 16 20:53:35 修改本文.[FROM: 202.102.109.62] ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.102.109.62]
|
|