Какой вызов перед вилкой?

Давным-давно я отправился на собеседование с очень странной компанией в Лондоне, которая утверждала, что она является экспертом Unix. В любом случае, эти люди были полными психами, и неудивительно, что компания, похоже, больше не существует, но на собеседовании они задали мне следующий вопрос:

Каков первый звонок для запуска нового процесса?

Поэтому я ответил, что первый звонок – это fork . Два человека, беседующие со мной, сказали (очень настойчиво, как будто я пропустил что-то совершенно очевидное)

Какой призыв вы делаете, прежде чем делать вилку?

Теперь я понятия не имею об этом вопросе, и я должен сказать, что эти люди убедили меня, что они были бездушными идиотами по причинам, совершенно не связанным с этим вопросом, но почему-то этот вопрос все еще меня беспокоит. Есть ли какой-то звонок, который делается перед вилкой? Есть ли какая-то тонкость, которую я пропустил?

Я стесняюсь ставить это как ответ, как можно только догадываться, но:

  1. flush stdout в случае, если ребенок будет выполнять вывод до exec.
  2. закройте все дескрипторы открытых файлов, превышающие 2, предполагая, что новый процесс ожидает «стандартную» среду, как она будет получена из оболочки.
  3. какая-то неясная вещь, требуемая каким-то неясным вариантом, как Юнис , хотя они очень умны, чтобы знать.

Любой способ, которым вы его поцарапаете, задавая неясный фактический вопрос, – это не способ получить что-либо о кандидате, за исключением, возможно, того, как они реагируют на глупые вопросы.

Я предполагаю, что они означают, что вы должны называть «pipe», чтобы предоставить родительскому процессу возможность контролировать стандартный ввод или стандартный вывод дочернего процесса. Это самый распространенный вызов, который встречается перед «вилкой».

Я согласен, это плохой вопрос. Было бы неплохо, если бы они указали, что вы создаете процесс как часть конвейера или что-то в этом роде. Важно знать порядок операций – создать канал (ы) перед «вилкой», затем закрыть противоположные неиспользуемые концы в каждом процессе, использовать «dup2», чтобы поместить дескрипторы ребенка в нужное место, вызвав некоторый «exec» функция в ребенке, обработка сбоев и т. д.

(Тот факт, что у него есть догадки экспертов, доказывает, что это плохой вопрос.)

Я предполагаю, что

  • либо они думали о чем-то, что применимо только к конкретной ситуации, о которой они не упомянули, например, о промывочных буферах;
  • или они имели в виду то, что вы сделали бы после разветвления;
  • или они означали что-то, что вы сделали бы до того, как исполните (это другая половина нереста другой программы), ожидая ответную fork , но они не понимали все это и путали эти два.