Linux CreateProcess?

时间:2011-05-04 12:37:04

标签: c++ linux createprocess

我在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()将关闭新流程。

8 个答案:

答案 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正是您所寻找的。