0

我创建了一个名为的函数listProcesses,它按以下顺序调用以下 Vix 命令:

  1. VixHost_Connect
  2. VixHost_OpenVM
  3. VixVM_LoginInGuest
  4. VixVM_ListProcessesInGuest
  5. VixVM_LogoutFromGuest
  6. VixHost_Disconnect

请注意,我没有调用VixVM_PowerOn,因为我手动启动了虚拟机。

该函数listProcesses()是用 C 语言编写的,但我将其导出为一个.pyd文件以与 Python 一起使用。

在 Python 解释器中,我运行以下代码:

from myModule import listProcesses

for i in xrange(1000):
    print listProcesses()

该函数listProcesses()为我提供了循环的前约 30 次迭代的预期输出(代表虚拟机内运行的进程名称的字符串列表)for,但之后它开始打印一个空列表。

我使用 Visual Studio 2012 中的调试器进行调查,看起来在for循环约 30 次迭代后,函数VixVM_LoginInGuest()返回错误3006。从 Vix 文档中,该错误意味着“需要打开虚拟机电源。”。

我检查过,虚拟机已开机并响应,并且 VmwareTools 仍在虚拟机内运行。

我想补充一点,我按照文档的建议释放了所有手柄。另外,如果有任何帮助,如果我在开始收到错误后暂停执行 python 脚本并重新启动虚拟机,则脚本会开始打印另外约 30 个的预期输出(取决于我运行的主机)脚本,它可能多达 80) 次,然后它再次开始打印一个空列表。

我想知道为什么会出现这个问题。

编辑:在我进一步调查之后,我注意到该函数VixHost_OpenVM创建了一个到虚拟机的 TCP 连接,并且连接永远不会关闭。当连接数达到一定数量时,操作系统可能会禁止来自我的脚本的任何新连接。有没有办法在不关闭脚本的情况下关闭未使用的连接?

4

1 回答 1

0

我已经找到了我的问题的答案,并且由于看起来没有人会回答它,所以我将自己发布答案,以供将来可能遇到此问题的人使用。

问题是我VixHost_Connect每次运行该函数时都会调用,因此该函数每次VixHost_OpenVM都会创建一个到虚拟机的新 (TCP) 连接。几次调用后,我将达到操作系统强加的 TCP 连接限制,进一步调用VixHost_OpenVM将失败。

解决方法是在函数VixHost_Connect中调用initmodule()函数,并将句柄存储为全局变量,供其他方法使用。完成此操作后,我的listProcesses()函数如下所示:

  1. VixHost_OpenVM
  2. VixVM_LoginInGuest
  3. VixVM_ListProcessesInGuest
  4. VixVM_LogoutFromGuest

因为我每次运行时都使用相同的 Vmware 句柄,listProcesses()所以只有当虚拟机不存在时才会创建与虚拟机的 TCP 连接,并且我可以根据需要多次调用该函数。

于 2013-04-23T15:03:17.210 回答