我正在尝试从Linux C ++程序中执行外部程序。
我正在调用方法system("gedit")
来启动Gedit编辑器的实例。但是我的问题是当Gedit窗口打开时,我的C ++程序等待它退出。
如何在不等待外部程序退出的情况下调用外部程序?
答案 0 :(得分:11)
您需要使用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程序。孩子本身退出,父进程可以立即收获。所以一个额外的分叉,但你把所有的代码保存在一个地方。
答案 1 :(得分:3)
答案 2 :(得分:1)
首先,您是否尝试使用system("gedit&")
在后台启动?
如果这不起作用,请尝试生成一个新线程并从那里运行gedit。
我认为您不关心编辑结果或编辑文件的内容?