阅读:2313回复:7
文件读写,奇怪的现象!!
我的程序:
FILE *fp = fopen(\"test.txt\", \"r\"); fclose(fp); 编译后,可执行文件名为testalign.exe,用filemon输出如下 我想问,为什么我只是打开关闭,为什么实际上会发生这么多反复的create,cleanup,close啊? 296 15:32:22 testalign.exe:1536 FSCTL_IS_VOLUME_MOUNTED H:\\my prog\\虚拟仪器\\testalign SUCCESS 297 15:32:22 testalign.exe:1536 FSCTL_IS_VOLUME_MOUNTED H:\\my prog\\虚拟仪器\\testalign SUCCESS 298 15:32:22 testalign.exe:1536 IRP_MJ_READ* H:\\my prog\\虚拟仪器\\testalign\\Debug\\testalign.exe SUCCESS Offset: 147456 Length: 4096 299 15:32:22 testalign.exe:1536 FSCTL_IS_VOLUME_MOUNTED H:\\my prog\\虚拟仪器\\testalign SUCCESS 300 15:32:22 testalign.exe:1536 IRP_MJ_CREATE H:\\my prog\\虚拟仪器\\testalign\\Debug\\testalign.exe.Local FILE NOT FOUND Attributes: Any Options: Open 301 15:32:22 testalign.exe:1536 IRP_MJ_READ* H:\\my prog\\虚拟仪器\\testalign\\Debug\\testalign.exe SUCCESS Offset: 4096 Length: 32768 302 15:32:22 testalign.exe:1536 IRP_MJ_READ* H:\\my prog\\虚拟仪器\\testalign\\Debug\\testalign.exe SUCCESS Offset: 139264 Length: 8192 303 15:32:22 testalign.exe:1536 IRP_MJ_READ* H:\\my prog\\虚拟仪器\\testalign\\Debug\\testalign.exe SUCCESS Offset: 36864 Length: 32768 304 15:32:22 testalign.exe:1536 IRP_MJ_READ* H:\\my prog\\虚拟仪器\\testalign\\Debug\\testalign.exe SUCCESS Offset: 131072 Length: 8192 305 15:32:22 testalign.exe:1536 FSCTL_IS_VOLUME_MOUNTED H:\\my prog\\虚拟仪器\\testalign SUCCESS 306 15:32:22 testalign.exe:1536 IRP_MJ_CREATE H:\\my prog\\虚拟仪器\\testalign\\test.txt SUCCESS Attributes: N Options: Open 307 15:32:22 testalign.exe:1536 IRP_MJ_CREATE H:\\my prog\\虚拟仪器\\testalign\\test.txt SUCCESS Attributes: N Options: Open 308 15:32:22 testalign.exe:1536 IRP_MJ_QUERY_INFORMATION H:\\my prog\\虚拟仪器\\testalign\\test.txt SUCCESS FileInternalInformation 309 15:32:22 testalign.exe:1536 IRP_MJ_CLEANUP H:\\my prog\\虚拟仪器\\testalign\\test.txt SUCCESS 310 15:32:22 testalign.exe:1536 IRP_MJ_CLOSE H:\\my prog\\虚拟仪器\\testalign\\test.txt SUCCESS 311 15:32:22 testalign.exe:1536 IRP_MJ_CREATE H:\\my prog\\虚拟仪器\\testalign\\test.txt SUCCESS Attributes: N Options: Open 312 15:32:22 testalign.exe:1536 FASTIO_QUERY_STANDARD_INFO H:\\my prog\\虚拟仪器\\testalign\\test.txt SUCCESS Size: 1226 313 15:32:22 testalign.exe:1536 IRP_MJ_CLEANUP H:\\my prog\\虚拟仪器\\testalign\\test.txt SUCCESS 314 15:32:22 testalign.exe:1536 IRP_MJ_CLOSE H:\\my prog\\虚拟仪器\\testalign\\test.txt SUCCESS 315 15:32:22 testalign.exe:1536 IRP_MJ_CLEANUP H:\\my prog\\虚拟仪器\\testalign\\test.txt SUCCESS 316 15:32:22 testalign.exe:1536 IRP_MJ_CLOSE H:\\my prog\\虚拟仪器\\testalign\\test.txt SUCCESS |
|
最新喜欢:Axi |
沙发#
发布于:2002-10-16 09:55
这其实不难理解,计算机打开一个文件的流程如下:
1.定位文件,打开文件所在的驱动器。如H:\\,这将导致FSCTL_IS_VOLUME_MOUNTED 的调用。 2.定位到文件所在的完整路径,如H:\\my prog\\虚拟仪器\\testalign\\Debug\\,这里为什么是IRP_MJ_READ我认为是读入内容。 3.文件定位好以后,下面就是打开文件。在打开文件的第一步就是CreateFile,CreateFile的行为和其所带的参数有关,如文件不存在则创建,存在则覆盖或不覆盖等。这将导致IRP_MJ_CREATE的调用。 4.CreateFile将获得一个文件句柄,即HANDLE,根据这个HANDLE可以获取一些文件的信息,如文件的大小,以便系统知道需要分配多少内存来存放这个文件的内容,这可能导致IRP_MJ_QUERY_INFORMATION的调用。 5.文件的大小等信息被获取后,系统分配足够大的内存来存放文件内容。如果分配失败,则很显然IRP_MJ_CLEANUP和IRP_MJ_CLOSE会被调用,失败返回。如果成功,则IRP_MJ_READ会被调用一次或多次来读取文件的内容到内存。 6.如果文件是可执行文件,则可执行文件本身又可能引用到了其它的资源,可能是EXE,也可能是DLL,所以中间又有可能有一些IRP_MJ_CREATE、IRP_MJ_READ的调用。 。。。。。。。 我想,我说的足够多了。希望对你有帮助! |
|
|
板凳#
发布于:2002-10-16 14:38
多谢,基本清楚啦
301,302,303,304读文件的偏移好像没什么规律?操作系统会这么做吗? 313,314和315,316为什么是重复的呢? |
|
地板#
发布于:2002-10-16 15:22
多谢,基本清楚啦 301,302,303,304读文件为什么大小不一致我想研究的必要性不大,你不必关心这个东西。 而对于IRP_MJ_CLEANUP和IRP_MJ_CLOSE为什么重复的其实我上面已经解释出来了。狭隘地理解可以是有多个IRP_MJ_CREATE发生过。本质上可能是因为OS在打开这个程序的过程中还打开了其它必须的附加资源,也可能是被打开的程序(.exe)得到执行权后装载了其它的资源或DLL,那么在程序退出后或者装载失败时当然需要关闭,例如最普通的CloseHandle, Free等操作都会激发IRP_MJ_CLEANUP的调用。 |
|
|
地下室#
发布于:2002-10-16 15:34
呵呵,不管怎么样
还是放分吧 |
|
5楼#
发布于:2002-10-16 18:47
谢谢给分。
|
|
|
6楼#
发布于:2002-10-17 16:34
我想对于test.txt文件引用到的其它文件而言,其对应的create,cleanup,close应该是它们自己的文件名,而不会再是test.txt了,这一点又如何解释呢?
|
|
7楼#
发布于:2002-10-17 16:45
sorry,请把上面的test.txt替换成可执行文件。
如果在explorer里面看看很乱的IRP列表,我觉得可以理解,因为我们无法肯定explorer究竟发了些什么东西。但是这种api调用引起的过程(类似于test.txt文件的打开和关闭),我觉得应该是非常清楚和确定的。 |
|