首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不等待外部程序退出的情况下运行该程序?

如何在不等待外部程序退出的情况下运行该程序?
EN

Stack Overflow用户
提问于 2010-03-11 10:06:12
回答 3查看 5.9K关注 0票数 2

我正在尝试从我的Linux C++程序内部执行一个外部程序。

我调用方法system("gedit")来启动Gedit编辑器的一个实例。然而,我的问题是,当Gedit窗口打开时,我的C++程序等待它退出。

如何在不等待外部程序退出的情况下调用它?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-11 10:09:34

您将需要使用forkexec

代码语言:javascript
复制
int fork_rv = fork();
if (fork_rv == 0)
{
    // we're in the child
    execl("/path/to/gedit", "gedit", 0);

    // in case execl fails
    _exit(1);
}
else if (fork_rv == -1)
{
    // error could not fork
}

你还需要收割你的孩子,这样才不会离开僵尸进程。

代码语言:javascript
复制
void reap_child(int sig)
{
    int status;
    waitpid(-1, &status, WNOHANG);
}

int main()
{
    signal(SIGCHLD, reap_child);
    ...
}

关于僵尸进程,你还有第二个选择。它使用了更多的资源(这种风格派生了两次),但好处是您可以让您的等待更靠近您的派生,这在维护方面更好。

代码语言:javascript
复制
int fork_rv = fork();
if (fork_rv == 0)
{
    fork_rv = fork();
    if (fork_rv == 0)
    {
        // we're in the child
        execl("/path/to/gedit", "gedit", 0);

         // if execl fails
        _exit(1);
    }
    else if (fork_rv == -1)
    {
        // fork fails
        _exit(2);
    }

    _exit(0);
}
else if (fork_rv != -1)
{
    // parent wait for the child (which will exit quickly)
    int status;
    waitpid(fork_rv, &status, 0);
}
else if (fork_rv == -1)
{
    // error could not fork
}

最后一种方式是创建一个子对象,而这个子对象又创建一个孙子对象,而这个孙子对象就是您的gedit程序的exec。子进程本身退出,父进程可以立即获取它。一个额外的分支,但是你把所有的代码都放在一个地方。

票数 11
EN

Stack Overflow用户

发布于 2010-03-11 10:09:56

哦,让我说出来吧!

http://en.wikipedia.org/wiki/Fork-exec

分叉!:)

票数 3
EN

Stack Overflow用户

发布于 2010-03-11 10:33:08

首先,您是否尝试使用system("gedit&")在后台启动

如果这不起作用,请尝试派生一个新线程并从那里运行gedit。

我假设您不关心编辑的结果,或者编辑过的文件的内容?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2422068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档