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

时间:2016-02-03 13:15:13

标签: c++ macos packaging terminate

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

我需要将这个工具包装成一个应用程序 - 没有什么真正的花哨,只是一个包含所有必要资产的漂亮图标,这样简单的用户只需双击即可启动它。我过去曾成功使用Platypus制作这样的应用程序。

但是我无法找到正确退出程序的方法。在我的程序中无法std::cin,我认为在退出时(从菜单或cmd-Q)platypus只发送一个SIGTERM或类似于我的程序(我无法真正使用)这是为了正确清理我的应用程序 - 我需要在main上结束无限循环,并在离开main时隐式调用所有析构函数。

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

2 个答案:

答案 0 :(得分:1)

我用一个使用Qt Framework的应用程序包装它,它也使用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
}

答案 1 :(得分:0)

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

这是我编写的一个程序,但是在C语言中,将信号与处理程序绑定到&#34;信号&#34;是一种常见的做法。功能。鉴于您正在使用C ++,您可以直接使用C,或者在C ++中找到相同的东西(其中肯定有相同的构造)。关键是使用信号函数将信号与处理程序绑定。

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