Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不等待外部程序退出的情况下运行它? 我试图从我的Linux C++程序内部执行一个外部程序。_C++_C_Linux - Fatal编程技术网

如何在不等待外部程序退出的情况下运行它? 我试图从我的Linux C++程序内部执行一个外部程序。

如何在不等待外部程序退出的情况下运行它? 我试图从我的Linux C++程序内部执行一个外部程序。,c++,c,linux,C++,C,Linux,我正在调用方法system(“gedit”)来启动gedit编辑器的实例。但是我的问题是当GeDIT窗口打开时,我的C++程序等待它退出。 如何在不等待外部程序退出的情况下调用它?您需要使用fork和exec int fork_rv = fork(); if (fork_rv == 0) { // we're in the child execl("/path/to/gedit", "gedit", 0); // in case execl fails _exi

我正在调用方法
system(“gedit”)
来启动gedit编辑器的实例。但是我的问题是当GeDIT窗口打开时,我的C++程序等待它退出。
如何在不等待外部程序退出的情况下调用它?

您需要使用
fork
exec

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
}
您还需要收获您的孩子,以免留下僵尸过程

void reap_child(int sig)
{
    int status;
    waitpid(-1, &status, WNOHANG);
}

int main()
{
    signal(SIGCHLD, reap_child);
    ...
}
关于僵尸进程,您还有第二个选择。它使用了更多的资源(这种味道会分叉两次),但好处是您可以让等待离分叉更近,这在维护方面更好

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
}
最后一种风格所做的是创建一个子元素,子元素依次创建一个孙子元素,孙子元素就是exec的gedit程序。子进程本身退出,父进程可以立即获取它。所以多了一个叉子,但是你把所有的代码都放在一个地方。

哦,让我说吧


叉子!:)

首先,您是否尝试使用
系统(“gedit&”)在后台启动

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


我想你并不关心编辑的结果,或者编辑文件的内容?

您能举一个例子说明如何使用fork和exec一起调用gedit吗?您应该在这里使用
\u exit
而不是
exit
:否则您可能会得到工件,例如相同的缓冲区被两个不同的进程刷新。耶。现在,更多的细节:您可以使用
signal(SIGCHLD,SIG_IGN)
,但是如果您安装了一个信号处理程序,您应该真正使用
sigaction
,因为
signal
在不同的unix上有不同的历史行为,而
sigaction
更标准化(更通用)。如果要获取多个子项,但只输入一次
SIGCHLD
处理程序,会发生什么情况?如何将参数传递给gedit?调用execl()时我还收到一个警告:函数调用中缺少sentinel要将参数传递给gedit,请向exec调用
execl(“/path/to/gedit”、“gedit”、“arg1”、“arg2”、0)添加额外的参数确保你有最后一个
0
,那是丢失的哨兵。感谢链接,我对fork读取有了更好的理解。刚刚尝试过,效果很好。感谢您提供了不同的方法。