Ami*_*yan 9 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;
}
Run Code Online (Sandbox Code Playgroud)
注意:
system()阻止当前进程,这并不好.我想继续当前的流程.
exec()系列替换当前正在执行的图像,这并不好.
如果当前进程关闭,popen()将关闭新进程.
Phi*_*ipp 36
将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));
}
}
Run Code Online (Sandbox Code Playgroud)
dav*_*mac 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()
阶段将失败.
小智 5
你写了:
我想在我的库中创建一个新进程而不替换当前正在执行的映像。system() 会阻塞当前进程,这样不好。我想继续当前的流程。
只需在命令调用后添加一个 & 符号即可。例子:system("/bin/my_prog_name &");
您的进程不会被阻止!
归档时间: |
|
查看次数: |
30180 次 |
最近记录: |