【问题标题】:Modern C++ way of starting and terminating a linux program现代 C++ 启动和终止 linux 程序的方法
【发布时间】:2022-01-25 15:34:54
【问题描述】:

我有一个 C++ 程序,它需要根据用户输入来启动和停止给定的 Linux 程序。

我在下面的代码中简化了我当前使用的逻辑:

int pid = fork();

if (pid == -1)
{
    //Handle error
}
else if (pid == 0)
{
    execlp("my_program", nullptr);
    exit(0);
}
else
{
    //Main program stuff

    if(/* user selects close "my_program"*/)
    {
        kill(pid, SIGTERM);
    }

    //Other main program stuff
}

一切正常,但我想知道在这种情况下是否有其他方法可以使用,也许更多的是现代 C++ 风格。

提前致谢。

【问题讨论】:

  • 听起来像是 RAII 的经典用法?
  • 看看 Boost.Process (boost.org/doc/libs/1_78_0/doc/html/boost_process/tutorial.html)。 bp::child 可以启动(与 std::system 不同的是异步)一个进程,该进程可以等待、终止等。
  • 是的,还有其他方法,但是如果您的程序已经正常运行,那么您希望获得什么? “[现代] C++ 风格”是达到目的的手段,而不是目的本身。
  • @m88 谢谢,我去看看
  • @JohnBollinger 我认为尝试和学习新的做事方式总是好的,即使这是你已经做过数千次的事情。

标签: c++ linux fork exec


【解决方案1】:

看看 boost::process。

可以通过多种方式生成进程。例如,在您的示例中,您分叉了该进程,但您没有关闭子进程中的克隆文件描述符。这是那些调用 fork 的人经常忘记的做法,并且可能导致绑定到端口问题(端口/地址已在使用中)或其他难以调试的问题。

在一段时间内,甚至 boost 都不能完全正确地做到这一点。

【讨论】:

  • 谢谢,我会调查的
【解决方案2】:

现代方法是使用像 Boost.Process https://www.boost.org/doc/libs/1_78_0/doc/html/process.html 或 Qt https://doc.qt.io/qt-5/qprocess.html 这样的库。

【讨论】:

    猜你喜欢
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2014-04-07
    • 1970-01-01
    • 2016-08-14
    • 2014-07-15
    相关资源
    最近更新 更多