我在linux平台上开发。
我想在我的库中创建一个新进程而不替换当前正在执行的映像。
因为我正在开发一个库,所以我没有主要功能。
我希望在调用程序应用程序关闭后继续新进程(就像CreateProcess Windows API一样)。
是否可以在Linux中使用?
像这样的功能:void Linux_CreateProcess(const char* app_name)
{
// Executing app_name.
// ???????? what is the code ??????
// app_name is running and never close if current application close.
return;
}
注意:
system()阻止当前进程,这并不好。我想继续目前的流程。
exec()系列替换当前正在执行的图像,效果不佳。
如果当前流程已关闭,popen()将关闭新流程。
答案 0 :(得分:36)
已经提到了fork
/ exec
组合,但还有posix_spawn
系列函数可用作fork
+ {{1并且更直接等同于exec
。以下是两种可能性的示例:
CreateProcess
答案 1 :(得分:15)
fork()
然后exec()
是标准解决方案。
使用fork()
(或vfork()
)启动一个单独的进程,该进程将是父进程的克隆。在子进程和父进程中,继续执行,但fork
在两种情况下都返回不同的值,允许您区分。然后,您可以在子进程中使用exec()
。
但请注意 - 我自己的一篇博文(http://davmac.wordpress.com/2008/11/25/forkexec-is-forked-up/):
似乎没有任何简单的符合标准的方式(甚至通常是可移植的方式)并行执行另一个进程并确保exec()调用成功。问题是,一旦你fork()d然后成功exec()d你就无法与父进程通信以通知exec()成功。如果exec()失败,那么你可以与父进行通信(例如通过信号),但是你无法告知成功 - 父进程可以确定exec()成功的唯一方法就是对子进行wait()完成的过程(并检查没有失败指示),当然这不是并行执行。
这个问题的潜在解决方案,如果您遇到问题:
[...]使用pipe()创建一个管道,将输出端设置为close-on-exec,然后fork()(或vfork()),exec(),并写一些东西(也许是errno) )如果exec()失败(在调用_exit()之前)到管道。父进程可以从管道读取,如果exec()成功,将立即获得输入结束,如果exec()失败,则会获得一些数据。
(请注意,如果子进程的运行优先级低于父进程,则此解决方案容易导致优先级倒置。
在其他答案中也提到了posix_spawn
,但它的可移植性稍差(特别是在旧系统上不可用)并且无法解决上述问题,因为它通常以fork的形式实现/ exec无论如何都可以在exec()
阶段失败之前返回成功。
答案 2 :(得分:4)
您写道:
我想在我的库中创建一个新进程而不替换当前正在执行的图像。 system()阻止当前进程,这并不好。我想继续目前的流程。
在命令调用后添加一个&符号。
示例:system("/bin/my_prog_name &");
您的流程不会被阻止!
答案 3 :(得分:3)
执行此操作的经典方法是使用fork()创建子进程,然后使用其中一个exec()函数替换子进程的执行映像,保持父进程不变。然后这两个过程将并行运行。
答案 4 :(得分:2)
您应该使用fork()
,然后使用execvp()
。
fork()
函数创建一个新的子进程。在父进程中,您将收到子进程的进程ID。在Child进程中,返回的进程ID为0,这告诉我们该进程是子进程。
execvp()
用新的过程映像替换调用过程映像。这具有使用调用进程的进程ID运行新程序的效果。请注意,未启动新进程;新的过程映像只是覆盖了原始过程映像。 execvp函数最常用于覆盖通过调用fork函数创建的过程映像。
答案 5 :(得分:2)
是的,fork()和exec ..()是正确的解决方案。看看这段代码是否可以帮到你:
switch( fork() )
{
case -1 : // Error
// Handle the error
break;
case 0 :
// Call one of the exec -- personally I prefer execlp
execlp("path/to/binary","binary name", arg1, arg2, .., NULL);
exit(42); // May never be returned
break;
default :
// Do what you want
break;
}
答案 6 :(得分:2)
我认为posix_spawn会做你想要的。在内部它可能会做fork / exec,但也许它也会做一些时髦有用的东西。
答案 7 :(得分:0)
我认为fork
正是您所寻找的。 p>