Linux CreateProcess?

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()阶段将失败.

  • 没关系.当你fork()时,从你调用fork()的点继续执行子进程 - 它不会在main()中重启. (3认同)

小智 5

你写了:

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

只需在命令调用后添加一个 & 符号即可。例子:system("/bin/my_prog_name &");

您的进程不会被阻止!