首页 > 解决方案 > 如何运行 2 个子进程,但在 C 中一个接一个地运行?

问题描述

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

标签: cforkposixwaitchild-process

解决方案


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 命令,这是一件好事)。

当然,所有三个片段都缺少错误检查。


推荐阅读