如何从 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 classesclear functions。您可以调用clear all清除所有内容。)

在致电engClose 之前。

此外,确保为添加到 Matlab 搜索路径的每个路径调用 rmpath(...)

如果在调用 engClose 方法之前正确清理 Matlab 进程,那么调用异步 Matlab engClose 就可以了。

【讨论】:

clear 不会关闭类和函数。它只是从当前工作区中删除所有变量。 clear functions 从内存中清除函数,clear classes 清除变量、函数和类定义。这些选项都不会使 MATLAB 发布打开的文件句柄。从 MATLAB 的路径中删除目录也不应该这样做。但是,如果您有一个保留资源的 MEX 文件或 M 文件(例如,使用 persistent 变量),那么清除它们会有所帮助。但如果他们是mlocked,您需要先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() 并等待其进程关闭?的主要内容,如果未能解决你的问题,请参考以下文章

如何调试 Matlab 引擎 C API?

如何从 GTK+2 C 代码中调用 matlab/octave 函数

JAVA中如何调用API函数?

如何从 C 调用在 MATLAB 中创建并在 C 中编译的函数?

从 C 调用 MATLAB

如何从 Matlab 调用具有多个输出的 C++ 函数?