如何从 Matlab C API 调用 engClose() 并等待其进程关闭?
Posted
技术标签:
【中文标题】如何从 Matlab C API 调用 engClose() 并等待其进程关闭?【英文标题】:How to call engClose() from Matlab C API and wait for its process to be closed? 【发布时间】:2019-09-12 20:37:02 【问题描述】:我正在使用MATLAB C API 运行一些脚本并生成一些 Simulink 模型。问题是,当我使用 MATLAB 完成工作时,我调用:
engClose(instance);
关闭 MATLAB 引擎。但是似乎调用engClose
方法后,MATLAB仍然对生成的文件具有独占访问权限,并且我在调用该方法后无法使用这些文件。使用此方法后睡眠 2-3 秒,即可解决所有问题。
我检查了engClose
文档here。文档描述:
此例程向 MATLAB 引擎会话发送退出命令,然后 关闭连接。
这个描述是否意味着engClose
方法不等待MATLAB进程关闭?如果是,有没有其他方法可以等待 MATLAB 完全关闭?
更新 1: 我的应用程序是用 C++11 开发的,但是这个 MATLAB 互操作性部分是很久以前用 C 和 MATLAB C API 编写的。该应用程序的目标平台是 Windows 和 Linux。
【问题讨论】:
也许在 C 中你可以检查 MATLAB 进程是否还活着? 我不确定,但解决方案可能依赖于平台。因此,最好在问题中也包含该信息。另外,我添加了 C 标记,但您可能正在使用 C++ 进行编程。请修正标签以包含您用于控制 MATLAB 的语言。 @CrisLuengo 更新了所需信息。 @CrisLuengo 我看到在 MATLAB C++ API 中有一个类似的 API,称为终止。此方法的行为是否与 engClose 相同?还是等待MATLAB进程关闭? @Gupta:我使用 MATLAB 引擎接口的经验很少。而且我从未使用过 C++ API。但我想这是同一件事,您将命令发送到 MATLAB 以关闭,但 MATLAB 需要一段时间才能关闭。我假设在 Linux 上有一种方法可以监视 MATLAB 进程并查看它何时完成,而在 Windows 上有一种不同的方法可以做到这一点。或者你可以监控文件,看看它的锁何时被释放。 【参考方案1】:经过几天的调查,我发现没有标准的同步关闭Matlab的方法。但是您可以做的是尝试关闭所有:
-
打开文件(调用
fclose all
关闭所有打开的文件)
类和函数(分别调用clear classes
或clear functions
。您可以调用clear all
清除所有内容。)
在致电engClose
之前。
此外,确保为添加到 Matlab 搜索路径的每个路径调用 rmpath(...)
。
如果在调用 engClose
方法之前正确清理 Matlab 进程,那么调用异步 Matlab engClose
就可以了。
【讨论】:
clear
不会关闭类和函数。它只是从当前工作区中删除所有变量。 clear functions
从内存中清除函数,clear classes
清除变量、函数和类定义。这些选项都不会使 MATLAB 发布打开的文件句柄。从 MATLAB 的路径中删除目录也不应该这样做。但是,如果您有一个保留资源的 MEX 文件或 M 文件(例如,使用 persistent
变量),那么清除它们会有所帮助。但如果他们是mlock
ed,您需要先munlock
他们才能clear
他们。
另外,fclose all
将关闭所有使用fopen
打开的文件。
@CrisLuengo 感谢 cmets。我将它们应用到我的答案中。实际上,在我的实现中,我发现如果我不调用clear classes
,我的mexfiles 不能被我的程序移动。所以,我重新开始做这一步。另外,我发现如果一个目录在MATLAB路径列表中,你可以通过windows explorer将其删除,但不能删除它有问题!!! (例如使用QDir::rmdir
)。您可以自己检查一下。
@CrisLuengo 我正在使用 Matlab R2017b。
好的。 Windows 很奇怪... :) 在 Linux 或 MacOS 中这些都不是必需的。以上是关于如何从 Matlab C API 调用 engClose() 并等待其进程关闭?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 GTK+2 C 代码中调用 matlab/octave 函数