【问题标题】:How to run 2 child processes, but run one subsequent to another in C?如何运行 2 个子进程,但在 C 中一个接一个地运行?
【发布时间】:2020-11-01 10:53:54
【问题描述】:

我试图在一个新程序中运行两个预制的可执行文件,但是在它们自己的子进程中运行这两个原始的可执行文件,所以基本上,只需将父进程 fork() 分成两个子进程。但是,我看到很多关于运行多个子进程并行的问题,但我想先运行一个,等待第一个完成,然后再运行第二个。也许这不言而喻,但是之后,在第二个孩子完成后返回父进程(所以我可以打印一些消息,通知用户两个可执行文件都已完成)。我对使用 wait() 和 waitpid() 函数非常不熟练,这些对我想要做的事情非常关键。 无论如何,有人可以给我一个快速的示例程序,以确保一个子进程运行随后到第二个?非常感谢您的宝贵时间!!

【问题讨论】:

  • 等待第一个,然后再分叉第二个。
  • stackoverflow.com/a/19099707/13596037 有一个示例 - 为第一个孩子执行此操作,然后为第二个孩子再次执行整个操作。

标签: c fork posix wait child-process


【解决方案1】:
system("command1");
system("command2");

这大致相当于以下内容:

{
   const char* child_argv[] = { "command1", NULL };
   pid_t pid = fork();
   if (!pid) {
      execvp(child_argv[0], child_argv);
      exit(255);  // errno should probably be sent to parent first.
   }

   waitpid(pid, NULL, 0);
}

{
   const char* child_argv[] = { "command2", NULL };
   pid_t pid = fork();
   if (!pid) {
      execvp(child_argv[0], child_argv);
      exit(255);  // errno should probably be sent to parent first.
   }

   waitpid(pid, NULL, 0);
}

在 POSIX 系统上,您可以使用 spawn 代替 fork

{
   const char* child_argv[] = { "command1", NULL };
   pid_t pid;
   posix_spawnp(&pid, child_argv[0], NULL, NULL, child_argv, environ);
   waitpid(pid, NULL, 0);
}

{
   const char* child_argv[] = { "command2", NULL };
   pid_t pid;
   posix_spawnp(&pid, child_argv[0], NULL, NULL, child_argv, environ);
   waitpid(pid, NULL, 0);
}

后两种解决方案避免使用 shell(如果您有文件名或路径而不是 shell 命令,这是一件好事)。

当然,所有三个 sn-ps 都缺少错误检查。

【讨论】:

  • system 调用一个 shell。 OP 并没有说他们想这样做。
  • 很好 - 除了如果执行失败,那么您将发生比您讨价还价更多的事情 - 在执行之后退出。
  • 由于正确处理所有极端情况很复杂,而且不是本 Q/A 的真正重点,使用 posix_spawn 代替如何?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多