我是在Linux平台上开发的。
我想在我的库中创建一个新的进程,而不替换当前执行的映像。
因为我正在开发一个库,所以我没有一个主要的功能。
我希望在调用程序关闭后继续新进程(就像CreateProcess Windows一样)。
在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()阻塞当前进程,这是不好的。我想继续当前process.exec()系列替换当前正在执行的映像,如果当前进程关闭,则不是good.popen()关闭新进程。发布于 2011-05-04 12:39:22
现在,posix_spawn可能是首选的解决方案。
在此之前,fork()和execXX()都是这样做的(其中execXX是exec函数族之一,包括execl、execlp、execle、execv、execvp和execvpe)。在当前的GNU库中,至少对于Linux来说,posix_spawn是通过叉/exec实现的;Linux没有posix_spawn系统调用。
您将使用fork() (或vfork())启动一个单独的进程,该进程将是父进程的克隆。在子进程和父进程中,执行都在继续,但是fork在这两种情况下都返回一个不同的值,允许您进行区分。然后,您可以在子进程中使用其中一个execXX()函数。
但是,请注意这个问题--从我的博客文章(http://davmac.wordpress.com/2008/11/25/forkexec-is-forked-up/)中借用的文本:
似乎没有任何简单的标准--一致的方法(甚至是可移植的方式)来并行执行另一个进程,并且确保exec()调用是成功的。问题是,一旦您拥有了fork()d,然后成功地执行了exec()d,您就无法与父进程通信来通知exec()是否成功。如果exec()失败,那么您可以与父进程进行通信(例如,通过一个信号),但是您不能通知成功--父进程确保exec()成功的唯一方法是等待()等待子进程完成(并检查没有失败指示),当然,这不是并行执行。
也就是说,如果execXX()成功了,您将不再拥有控制权,因此无法将成功信号传递给原始(父进程)进程。
这个问题的潜在解决方案,如果在您的情况下是一个问题:
...使用pipe()来创建管道,将输出端设置为接近-exec,然后在调用_exit()之前(在调用()之前)向管道写入一些东西(可能是errno)。父进程可以从管道中读取,如果exec()成功,将得到一个即时的输入端,如果exec()失败,则获得一些数据。
(请注意,如果子进程运行的优先级低于父进程,并且父进程等待它的输出,则此解决方案容易导致优先级反转)。
正如上面和其他答案所提到的,还有posix_spawn,但是它不能解决检测执行子可执行文件失败的问题,因为它通常是以fork/exec的方式实现的,并且可以在exec()阶段失败之前返回成功。
发布于 2011-05-04 13:59:24
已经提到了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));
}
}发布于 2014-05-06 19:57:07
你写道:
--我想在我的库中创建一个新的进程,而不替换当前执行的映像。system()阻塞当前进程,这是不好的。我想继续当前的进程.
只需在命令调用后添加一个符号。示例:system("/bin/my_prog_name &");
您的过程不会被阻止!
https://stackoverflow.com/questions/5883462
复制相似问题