Создание дочернего процесса в UNIX/Linux использует процедуру, обычно известную как fork. Это делается для копирования почти всего адресного пространства процесса текущего процесса (код программы, данные, почти все) на ребенка. Идентификатор процесса (PID) отличается у ребенка, но почти все остальное одно и то же.
Один из элементов в процессе, который скопирован, представляет собой таблицу дескриптора файла . Это похоже на массив. Существует запись для каждого открытого файла, и по соглашению первые три, 0, 1, 2 представляют собой стандартные потоки , stdin, stdout, stderr. Этим объясняются номера, используемые в 2>&1
. Когда мы перенаправляем, это три записи, которые были изменены у ребенка. Это делается оболочкой, так как на этом этапе наш дочерний процесс является другим процессом оболочки.
Теперь приходит волшебная часть, в общем известная как exec. Если мы хотим запустить другую программу , например ls
, мы можем переключать программы в рамках процесса. Итак, теперь новая программа начинается с начала, но некоторые основные элементы сохраняются. Такие вещи, как пользователь, группа, текущий каталог, umask и таблица дескриптора файла, сохраняются для использования новой программой.
Итак, если таблица дескриптора файла была изменена ранее, новая программа наследует этих изменений. Нет ничего, чтобы остановить программу от переопределения этих настроек и использования разных файлов, но это редко делается.
Все это по умолчанию. Программы могут изменять, какие файловые дескрипторы и другие элементы сохраняются на границе fork/exec, но обычно этого не делают.
Да, это так. – anubhava