我正在尝试从我的Linux C++程序内部执行一个外部程序。
我调用方法system("gedit")来启动Gedit编辑器的一个实例。然而,我的问题是,当Gedit窗口打开时,我的C++程序等待它退出。
如何在不等待外部程序退出的情况下调用它?
发布于 2010-03-11 10:09:34
您将需要使用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
}最后一种方式是创建一个子对象,而这个子对象又创建一个孙子对象,而这个孙子对象就是您的gedit程序的exec。子进程本身退出,父进程可以立即获取它。一个额外的分支,但是你把所有的代码都放在一个地方。
发布于 2010-03-11 10:09:56
发布于 2010-03-11 10:33:08
首先,您是否尝试使用system("gedit&")在后台启动
如果这不起作用,请尝试派生一个新线程并从那里运行gedit。
我假设您不关心编辑的结果,或者编辑过的文件的内容?
https://stackoverflow.com/questions/2422068
复制相似问题