从服务 linux c++ 打开应用程序

Posted

技术标签:

【中文标题】从服务 linux c++ 打开应用程序【英文标题】:Opening an application from service linux c++ 【发布时间】:2014-12-15 14:39:59 【问题描述】:

我想从另一个应用程序 B 打开一个应用程序 A。通过打开它,我不想在 B 中打开它。我找到了很多从另一个应用程序中调用应用程序的方法。但是,我想做的是同时打开另一个(A)。我怎样才能做到这一点? fork() 和 exec() 似乎在 B 中打开 A。我正在为 Linux 和 Mac 开发代码。建议将不胜感激。谢谢。

【问题讨论】:

如果你想从命令提示符运行它们,只需写./A& ./B& 【参考方案1】:

在进程 A(父进程)中调用 fork() 来创建进程 A 和 B(子进程)

在进程A中等待B退出...

在进程B中,再次调用fork()(创建B和C)并退出

这会导致 A 收集 B 的状态码并防止它变成僵尸。

B 的退出导致 C 成为孤儿,被 init 拥有,因此它不再是 A 的后代。

在进程C中,调用exec将当前进程中的程序替换成你想要的程序。

类似这样的:

#include <iostream>
#include <unistd.h>
#include <cassert>

using namespace std;

void forkBtoC()

    cout << "B forking" << endl;
    auto child = fork();
    if (0 == child) 
        cout << "C execing" << endl;
        execl("your-program-here", "arg1", "arg2", nullptr);
    
    else 
    


int main()

    // I am parent A
    cout << "A forking" << endl;
    auto result = fork();
    if (result == 0) 
        setsid();
        forkBtoC();
        // I am child B
    
    else if (result > 0) 
        // I am parent A. result is the pid of B
        int B_code = 0;
        waitpid(result, &B_code, 0);
        cout << "B returned " << B_code << endl;
    
    else 
        assert(!"failed to fork A");
    

    return 0;

【讨论】:

以上是关于从服务 linux c++ 打开应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在一个应用程序中打开另一个程序

从应用程序打开控制台

是否可以在 linux 的服务器终端中打开 X11 应用程序?

如何从 qt 应用程序 (c++) 打开可执行文件

如何从 Borland C++ 应用程序打开 HTMLHelp (.chm) 文件

从 Vis C++ 控制台应用程序打开 OpenDialog?