首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux CreateProcess?

Linux CreateProcess?
EN

Stack Overflow用户
提问于 2011-05-04 12:37:03
回答 8查看 41.1K关注 0票数 12

我是在Linux平台上开发的。

我想在我的库中创建一个新的进程,而不替换当前执行的映像。

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

我希望在调用程序关闭后继续新进程(就像CreateProcess Windows一样)。

在Linux中有可能吗?

类似于这样的功能:

代码语言:javascript
复制
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()关闭新进程。
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-05-04 12:39:22

现在,posix_spawn可能是首选的解决方案。

在此之前,fork()execXX()都是这样做的(其中execXXexec函数族之一,包括execlexeclpexecleexecvexecvpexecvpe)。在当前的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()阶段失败之前返回成功。

票数 15
EN

Stack Overflow用户

发布于 2011-05-04 13:59:24

已经提到了fork/exec组合,但是也有posix_spawn系列函数,它们可以作为fork + exec的替代物,并且更直接地等同于CreateProcess。以下是这两种可能性的一个例子:

代码语言:javascript
复制
#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));
  }
}
票数 41
EN

Stack Overflow用户

发布于 2014-05-06 19:57:07

你写道:

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

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

您的过程不会被阻止!

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5883462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档