如何修复我的"self-deleting" .exe提前删除?
How do I fix my "self-deleting" .exe from deleting itself early?
为了测试和个人概念证明,我有一个.exe文件,它只输出一个简单的字符串,然后调用系统暂停(字面意思是system("pause")
C++)。
我有一个简单的Python脚本,我正在Windows XP VM上测试,它在搞砸时执行以下操作:
subprocess.call(r'echo Nothing special. > c:blank.txt', shell=True)
subprocess.call(r'type pause.exe > c:blank.txt:ads.exe', shell=True)
subprocess.call(r'start c:blank.txt:ads.exe', shell=True)
subprocess.call(r'del c:blank.txt', shell=True)
显然,这些命令在命令行上都可以正常工作,为什么通过 Python 调用它们时不能正常工作?
我收到此弹出错误消息:
空白.txt:ads.exe 遇到了 问题,需要关闭。我们是 很抱歉给您带来不便。
如果你在中间 某物,你是信息 工作可能会丢失。
该文件也确实被删除了。似乎系统暂停只是被删除命令压碎了,当我期望弹出.exe时,等待我按回车键,然后脚本将继续并删除文件。
鉴于这些症状,我的理解是,只有在此可执行文件完成初始化后,您才能在此特定设置(Windows XP,可能在特定补丁级别,当可执行文件来自备用流时)安全地删除可执行文件。如果在加载可执行文件时将其删除,程序将崩溃。
在提示符下键入这些命令时,运行 start c:blank.txt:ads.exe
和 del c:blank.txt
之间会经过一些时间,使程序有足够的时间完成加载。当您从脚本运行它们时,两者之间的间隔要短得多(start
分支出一个新进程,并且新程序的初始化异步发生)。初始化和删除之间存在争用条件;哪一个获胜取决于执行删除的速度。
尝试在删除文件之前尝试延迟:
import subprocess, time
subprocess.call(r'echo Nothing special. > c:blank.txt', shell=True)
subprocess.call(r'type pause.exe > c:blank.txt:ads.exe', shell=True)
subprocess.call(r'start c:blank.txt:ads.exe', shell=True)
time.sleep(42) # 42 seconds is overkill, but the delay isn't predictable
subprocess.call(r'del c:blank.txt', shell=True)
发生的情况是每个subprocess.call(..., shell=True)
立即返回,因为它们只是告诉 shell 执行命令。在命令行上,调用 exe 以使用 start
命令运行仍会立即返回,即使该 exe 尚未终止。start
立即返回,需要告诉它等待:
subprocess.call(r'echo Nothing special. > c:blank.txt', shell=True)
subprocess.call(r'type pause.exe > c:blank.txt:ads.exe', shell=True)
subprocess.call(r'start /wait c:blank.txt:ads.exe', shell=True)
subprocess.call(r'del c:blank.txt', shell=True)
start
命令将在新的 shell 中启动程序,然后继续。要等待它完成使用call
:
subprocess.call(r'call c:blank.txt:ads.exe', shell=True)
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 运算符C++ "delete []"仅删除 2 个前值
- 删除指向指针的指针是运行时错误吗
- 将指针设置为"nullptr"并不能防止双重删除?
- 为什么示例代码访问IUnknown中已删除的内存
- 如何通过 getter 函数删除矢量的元素?
- 从控制台中删除最后打印的元素
- C++中的线程安全删除
- 如何从存储在std::映射中的std::集中删除元素
- 如何修复我的"self-deleting" .exe提前删除?