Linux的CreateProcess?

我在linux平台上开发。

我想在我的库中创build一个新的进程,而不用replace当前正在执行的图像。

因为我正在开发一个库,所以我没有一个主要function。

我希望在调用者closures之后继续新的进程(就像CreateProcess Windows API一样)。

在Linux中可能吗?

像这样的function:

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()系列取代当前正在执行的映像,这并不好。

  • 如果当前进程closures,popen()将closures新进程。

fork()然后exec()是标准的解决方案。

使用fork() (或vfork() )启动一个单独的进程,这将是父级的克隆。 在子进程和父进程中,执行都会继续,但是在任何一种情况下, fork返回不同的值,以便区分。 然后可以在子进程中使用exec()

您也可以阅读我的博客文章之一: http : //davmac.wordpress.com/2008/11/25/forkexec-is-forked-up/

fork / exec组合已经被提及,但是也有posix_spawn函数家族可以用作fork + exec的替代,并且更直接地等同于CreateProcess 。 这是两个可能性的例子:

 #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <spawn.h> #include <sys/wait.h> extern char **environ; void test_fork_exec(void); void test_posix_spawn(void); int main(void) { test_fork_exec(); test_posix_spawn(); return EXIT_SUCCESS; } void test_fork_exec(void) { pid_t pid; int status; puts("Testing fork/exec"); fflush(NULL); pid = fork(); switch (pid) { case -1: perror("fork"); break; case 0: execl("/bin/ls", "ls", (char *) 0); perror("exec"); break; default: printf("Child id: %i\n", pid); fflush(NULL); if (waitpid(pid, &status, 0) != -1) { printf("Child exited with status %i\n", status); } else { perror("waitpid"); } break; } } void test_posix_spawn(void) { pid_t pid; char *argv[] = {"ls", (char *) 0}; int status; puts("Testing posix_spawn"); fflush(NULL); status = posix_spawn(&pid, "/bin/ls", NULL, NULL, argv, environ); if (status == 0) { printf("Child id: %i\n", pid); fflush(NULL); if (waitpid(pid, &status, 0) != -1) { printf("Child exited with status %i\n", status); } else { perror("waitpid"); } } else { printf("posix_spawn: %s\n", strerror(status)); } } 

执行此操作的经典方法是使用fork()创建子进程,然后使用其中一个exec()函数来替换子进程的执行映像,而不改变父进程。 这两个过程将并行运行。

你写了:

我想在我的库中创建一个新的进程,而不用替换当前正在执行的图像。 system()阻塞当前进程,这并不好。 我想继续当前的过程。

在命令调用之后只需添加&符号。 例如: system("/bin/my_prog_name &");

你的过程不会被阻止!

你应该使用fork() ,然后使用execvp()

fork()函数创建一个新的子进程。 在父进程中,您会收到子进程的进程ID。 在子进程中,返回的进程ID是0,这告诉我们进程是一个子进程。

execvp()用新的过程映像替换调用过程映像。 这具有使用调用进程的进程ID运行新程序的效果。 请注意,新进程没有启动; 新的过程映像只是覆盖原始的过程映像。 execvp函数最常用于覆盖通过调用fork函数创建的过程映像。

是的,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; } 

我认为posix_spawn做你想要的。 在内部它可能做fork / exec,但也许它也做一些有趣的有用的东西。

我认为fork是你在找什么。