Что происходит, когда вы вводите «ls -l» в оболочке

Адриэль Толентино, Макс Стюарт и Майкл Шехнер

Оболочка UNIX - это просто программа, которая запускает другие программы в системе UNIX. Другими словами, это процесс со своим собственным PID (Process IDentifier), который создает новый процесс каждый раз, когда вы вводите команду. Это пользовательский интерфейс: он позволяет пользователю общаться с операционной системой - вы можете думать о нем как о «оболочке», которая защищает пользователей от системы и систему от пользователя.

Когда вы запускаете оболочку (которая используется по умолчанию при открытии терминала), она отображает свое приглашение (обычно $ или%) и пассивно ожидает вашей команды. Это часть основного процесса, называемого «родительским». Когда вы вводите «ls -l», вы указываете оболочке найти и выполнить эту команду. Во-первых, оболочка должна знать, какая часть команды на самом деле является именем команды (и, следовательно, файлом в системе или псевдонимом). Он анализирует текст на наличие пробелов и использует их в качестве разделителей, чтобы поместить команду и любые параметры в отдельные токены (man strtok для более глубокого погружения). Затем shell ищет совпадение с первым токеном (командой) в системе и, если он доступен, выполняет его.

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

В копии родительского объекта fork () возвращает PID вновь созданного дочернего элемента, поэтому родительская копия ожидает, пока этот PID больше не будет использоваться функцией wait (). В дочернем элементе fork () возвращает 0, поэтому он знает, что это копия, и выполняет следующие действия:

  1. Дочерний процесс проверяет, встроен ли «ls» в программу оболочки. Если это так, ребенок немедленно выполнит программу.
  2. Потомок проверяет, является ли команда псевдонимом.
  3. Если команда начинается с «./», процесс будет искать ее в текущем рабочем каталоге.
  4. Если команда начинается с «/», процесс будет искать ее в корневом каталоге.
  5. В противном случае дочерний процесс проверит, существует ли команда в любом из путей переменных среды. Если он находится в указанном ПУТЬ, он объединит команду в конце этого каталога (пример: «/ bin / ls», что имеет место при вводе ls [options] )
  6. Если команда не найдена (если какой-либо из вышеперечисленных шагов завершился неудачно), оболочка отобразит сообщение об ошибке о том, что команда не может быть найдена, а также количество циклов родительского цикла (пример : «./Sh: 3: notacommand: not found»)

В любом случае, когда команда найдена, она выполняется с помощью execve () и передает все аргументы, изначально заданные оболочке, такие как «-l». Execve () забирает управление у дочернего элемента и выполняет код, найденный в переданной функции, но под тем же PID, что и дочерний элемент.

Когда дочерний процесс (или его последующий вызов execve ()) возвращается, wait () возвращается в родительской функции, и родительская функция просто повторяет цикл (он находится в бесконечном цикле), чтобы отобразить приглашение, ожидающее ввода.

Зайдите сюда, чтобы узнать, что будет дальше:



Что происходит, когда вы вводите« ls -la в оболочку
Адриэля Толентино, Макса Стюарта и Майкла Шехнера medium.com»