我在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
是你在找什么。