如何在不等待外部程序退出的情况下运行它? 我试图从我的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读取有了更好的理解。刚刚尝试过,效果很好。感谢您提供了不同的方法。