如何将命令行工具包装到应用中并正确退出它

How to wrap a command line tool into an app and properly quit it?

本文关键字:退出 应用 命令行 工具 包装 工具包      更新时间:2023-10-16

我在C++中有一个多线程命令行程序。从终端启动时,我可以正确退出 q <RET> ,这将调用一系列clean_up例程,最终将释放所有资源。请注意,如果从未按下q <RET>程序将永远循环。另请注意,该程序会自行启动一些 GUI 窗口。

我需要将此工具包装为一个应用程序 - 没有什么特别的,只是一个漂亮的图标,其中包含所有必要的资产,以便简单的用户只需双击即可启动它。我过去曾成功地使用鸭嘴兽来制作这样的应用程序。

但是我找不到正确退出该程序的方法。没有办法从那里std::cin我的程序,我认为在退出(从菜单或 cmd-Q(时鸭嘴兽只是发送一个 SIGTERM 或类似于我的程序的东西(我真的不能使用它来正确清理我的应用程序 - 我需要结束 main 上的无限循环,并在离开 main 时隐式调用所有析构函数(。

难道没有其他简单的方法可以将我的程序包装为.app,而是以一种我可以在退出时调用特定函数的方式吗?我想用 Cocoa/Swift 创建一个虚拟应用程序,让我的程序成为静态库并从那里调用它,但必须有一种更简单的方法。

我会用一个使用Qt框架的应用程序来包装它,该应用程序也使用C++。

使用QProcess启动程序,文档指出: -

QProcess 类用于启动外部程序并与之通信

这里有一个简单的例子,说明你可以做什么...

#include <QApplication>
int main(int argc, char *argv[])
{
    // Main application class
    // Use QCoreApplication instead, if this is not a GUI app
    QApplication app(argc, argv);
    // launch the process with the given arguments
    QProcess *myProcess = new QProcess(parent);
    myProcess->start(program, arguments);
    if (!myProcess.waitForStarted())
        return -1;
    // quit the app as soon as it has started, but 
    // just for demonstration purposes
    myProcess.write("q"); 
    return app.exec(); // starts the event loop
}

您可以在应用程序中为 SIGTERM 构建处理程序。

这是我编写的一个程序来做到这一点,但在 C 中,使用"signal"函数将信号绑定到处理程序是一种常见的做法。 鉴于您使用的是C++,您可以直接将 C 与它一起使用,或者在 C++ 中找到等效的东西(其中肯定有一个相同的结构(。 关键是使用信号函数将信号与处理程序绑定。

https://github.com/jpnorair/otter/blob/master/main/main.c