找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 30009|回复: 11

[文件操作] 批处理怎样实现多进程环境下的文件读写?

[复制链接]
发表于 2009-8-24 21:55:30 | 显示全部楼层 |阅读模式
主要是想解决多进程环境下的日志读写时,如何避免“另一个程序正在使用此文件,进程无法访问”的错误。

因为使用了start启用多进程执行已提高程序运行效率,在访问到日志文件时,不可避免的遇到文件某一进程被占用,而其它进程无法读写的问题。

目前我的思路是:

任务进程不打开任何文件句柄
只向标准设备读写
而由调度进程去打开文件句柄
再将标准I/O重定向到指定文件中

调度.cmd
---------
(for /l %%i in (1,1,100) do (start /b "" 任务.cmd %%i )) >> 结果.log

任务.cmd
---------
echo.%date% %time% Process  %1 end.

但缺点是只能输出一个LOG,如果有选择性根据命令类别输出多个LOG则仍有问题。

想知道各位在遇到此问题时有何妙策?

[ 本帖最后由 qzwqzw 于 2009-8-24 22:12 编辑 ]
发表于 2009-8-24 22:20:22 | 显示全部楼层
  1. @echo off
  2. (for /l %%i in (1,1,100) do start /b cmd /d /c任务.cmd %%i)>result.log
复制代码
 楼主| 发表于 2009-8-24 22:54:53 | 显示全部楼层
能解决多个LOG的问题吗
发表于 2009-8-24 23:23:24 | 显示全部楼层
“有选择性根据命令类别输出多个LOG”
怎样选择呢?根据什么命令类别?
这样吗? for /l %%i in (1,1,100) do start /b cmd /d /c任务.cmd %%i>result%%i.log
 楼主| 发表于 2009-8-24 23:29:03 | 显示全部楼层
比如在“任务.cmd”中
所有的echo命令输出到echo.log
所有的find目录输出到find.log
发表于 2009-8-25 00:04:53 | 显示全部楼层
如果只有两个命令产生输出且没有错误发生,可以将其中一个的输出定向到标准错误输出。
eg, task.cmd
echo hello 1>&2
find bathome a.txt

(for %%a in (1 2) do start /b cmd /ca.bat %%a)>find.txt 2>echo.txt
 楼主| 发表于 2009-8-25 01:11:30 | 显示全部楼层
倒是一种不错思路

延伸一下
如果有多个LOG
可以使用未定义句柄3-9

不过很可惜
echo hello 1>&3
用法是有问题的
在句柄3没有定义之前
是不能被指向的
发表于 2011-5-24 20:27:17 | 显示全部楼层
还是不太明白,下面这个为什么没有效果呢?
dir /b 3>con 1>&3 1>nul
将句柄1的输出改到句柄3,如果可行的话,就可以“双线”输出了,但是不能理解为什么不成功
 楼主| 发表于 2011-5-24 21:21:53 | 显示全部楼层
你的语句这样理解
1、将con赋给句柄3
2、将句柄3复制给句柄1
3、将nul赋给句柄1
结果是句柄1为nul,句柄3为con
因为dir命令没有使用句柄3输出
所以最终命令无任何输出
发表于 2011-5-24 21:25:01 | 显示全部楼层
信号灯,PV操作。。
http://baike.baidu.com/view/703687.htm
发表于 2011-5-24 22:03:35 | 显示全部楼层
10楼,为什么你们什么都知道...
回qzw,好吧,我理解错了。那句柄3~9除了这么诡异的用途以外,到底有什么实际作用呢?
 楼主| 发表于 2011-5-24 22:06:55 | 显示全部楼层
在那个case里使用了类似信号灯的原理
所有的任务输出全部通过调度程序输出
多个任务同时输出时形成调度队列
在调度程序中使用一个标志文件做“信号灯”
A任务首先正常运行则开启信号灯-P操作
(创建标志文件)
B、C等任务在信号灯开启时被阻塞
(B、C等循环检查标志文件,存在则延迟随机毫秒数后继续检查)
A任务输出完成后关闭信号灯-V操作
(A删除标志文件)
B任务在信号灯关闭时首先运行并开启信号灯
(B首先检查到标志文件不存在则跳出循环,并重新建立标志文件)
C等任务在信号灯开启时被阻塞
如此循环往复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 03:23 , Processed in 0.020500 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表