создавать и пожинать дочерние процессы - PullRequest
0 голосов
/ 07 января 2019

У меня есть несколько вопросов о создании и использовании дочерних процессов.

Q1. Почему Linux автоматически запускает дочерние процессы, поэтому программистам не нужно использовать waitpid (), что снижает нагрузку на программистов?

Q2. Каковы преимущества создания дочерних процессов и позволяют дочерним процессам выполнять программы, например веб-серверы вызывают fork для создания дочернего процесса и вызывают execve для запуска программ cgi? мы не можем позволить родительским процессам запускать программы cgi?

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Q1. Linux (или UNIX в целом) пожинает дочерние процессы, только если родительский процесс умирает раньше дочернего. В этом случае ядро ​​позволяет некоторому процессу, определенному реализацией (который раньше был процессом init), принять потерянный процесс. Затем этот новый родительский процесс будет реагировать на изменения состояния процессов.

Q2. Формирование и обработка одной задачи на процесс - это один из способов параллельной обработки нескольких задач. В зависимости от ваших требований это часто приводит к гораздо более простому коду, чем обработка нескольких задач в одном процессе. В некоторых случаях это единственный возможный способ. Использование потоков является аналогичным решением. Другим решением было бы использовать select перед всеми возможными блокировками вызовов и убедиться, что вы обрабатываете часть каждой задачи один за другим.

Запуск CGI-программ означает, что вам нужно запустить интерпретатор сценариев. Если вы не внедрили интерпретатор самостоятельно, это означает, что вы должны запустить отдельную программу, которой сложно управлять. Когда сценарий занимает много времени или блокирует по какой-то причине, вы не хотите блокировать все другие задачи. Поэтому проще запускать его в дочернем процессе параллельно с принятием и обработкой запросов в родительском или других дочерних процессах. В этом случае трудно или часто невозможно предотвратить блокирование других задач отдельной программой, поэтому лучше сделать это в дочернем процессе.

0 голосов
/ 07 января 2019
  1. Linux не получает автоматически процессы, так как вы можете захотеть разветвить дочерний процесс и завершить родительский процесс, т. Е. Демонизировать процесс. Вам также нужен способ получить код выхода дочернего процесса, без этого механизма не было бы способа его получить. Если вы не хотите ждать дочернего процесса, при запуске приложения позвоните signal(SIGCHLD, SIG_IGN);, прежде чем разветвлять детей.

    Для окон записи используется та же схема использования, вызывая WaitForSingleObject для ожидания завершения дочернего потока, что вы можете пропустить, но это очень плохая практика, так как дескрипторы и коды возврата остаются в памяти висящими.

  2. Родительский процесс, если вы не используете многопоточность, не может выполнять более одной задачи за раз. Разветвление дочернего процесса для обработки входящего запроса позволяет обрабатывать несколько запросов асинхронно, например: https://jameshfisher.com/2017/02/25/tcp-server-fork.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...