Как запустить 2 дочерних процесса, но запускать один за другим в C? - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь запустить два готовых исполняемых файла в новой программе, но запустить эти два исходных исполняемых файла каждый в своем собственном дочернем процессе, так что в основном просто сделайте родительский процесс fork () на два дочерних. Тем не менее, я вижу МНОГО вопросов, связанных с параллельным запуском нескольких дочерних процессов , но я хочу сначала запустить один, дождаться завершения первого sh, а затем запустить второй. И, возможно, это само собой разумеющееся, но затем, после того, как второй дочерний процесс завершится, вернусь к родительскому процессу (так что я могу просто распечатать какое-то сообщение, уведомляющее пользователя о том, что оба исполняемых файла завершены). Я очень неопытен в использовании функций wait () и waitpid (), и они очень важны для того, что я пытаюсь сделать. В любом случае, кто-нибудь может дать мне быстрый пример программы, которая обеспечит выполнение одного дочернего процесса последующим вторым? Большое спасибо за уделенное время !!

1 Ответ

3 голосов
/ 12 июля 2020
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);
}

Последние два решения избегают использования оболочки (что хорошо, если у вас есть имя файла или путь, а не команда оболочки).

Конечно, во всех трех фрагментах отсутствует проверка ошибок.

...