Что такое исполняемый файл оператора канала / символа канала (символ вертикальной черты "|") в системе linux / unix - PullRequest
0 голосов
/ 10 сентября 2018

Обычно мы запускаем команды в окне терминала / tty / command в системе Linux. Если мы запускаем ls -l, мы знаем, что мы на самом деле выполняем файл с именем ls, расположенный /bin. Полный путь: /bin/ls.

В * nix-подобной системе много говорится о конвейере. Какой точный исполняемый файл, расположенный в системе, соответствует |? Даже если функция конвейера встроена в систему, должен быть найден фрагмент кода. Я не могу найти документацию об этом. Не так просто подобрать ответы на странице результатов Google.

Я прочитал некоторую элементарную информацию о создании конвейера или что-то связанное с конвейерным программированием на языке Си. Они очень сильно отличаются от поведения |. Оператор канала ("|") в оболочке делает то же самое, что и примеры, описанные в элементарных книгах по программированию на Си?

Помимо |, символа канала, каковы соответствующие файлы для > и <?

Обновление 1: После получения ответов из ваших постов ниже, я думаю, что мой оригинальный скелет механизма трубы называется «поддельная труба» от http://www.linfo.org/pipe.html

Ответы [ 4 ]

0 голосов
/ 10 сентября 2018

Символы <, >, >>, | не являются процессами в том же смысле, что и исполняемые файлы, такие как ls. Скорее, это инструкции для оболочки, которые изменяют способы создания других процессов.

Во-первых, обратите внимание, что, как бы вы ни вводили команды Linux, вы на самом деле напрямую не взаимодействуете с самой операционной системой Linux. Вы используете программу, называемую оболочкой - скорее всего, /bin/bash, но доступно несколько различных программ оболочки, большинство из которых работают во многом одинаково. Основное назначение оболочки - интерпретировать ваш ввод для запуска других процессов. Это включает системный вызов Linux fork (или, возможно, clone) для создания нового процесса в качестве дочернего процесса процесса оболочки, за которым следует системный вызов execve чтобы этот дочерний процесс загрузился и запустил указанную программу с указанными аргументами.

Оболочка может выполнять различные биты интерпретации на входе, чтобы определить, какой будет действительная программа и аргументы, например, подстановка псевдонимов команд, подстановка переменных среды и расширение символов ~, * и []. Точно так же символы <, >, >> и | имеют особое значение для оболочки, но вместо того, чтобы изменять имя или аргументы исполняемого файла, они точно изменяют способ создания дочернего процесса.

Процесс Linux обычно начинает свою жизнь с трех открытых «файловых дескрипторов»: стандартный ввод, стандартный вывод и стандартная ошибка. По умолчанию дочерние процессы оболочки будут использовать тот же ввод / вывод / ошибку, что и оболочка, что означает, что они могут получать ввод с клавиатуры через тот же механизм, что и оболочка, и вывод процесса появляется в том же окне. При использовании инструкций перенаправления <, > и >> оболочка изменяет файловые дескрипторы процесса между fork и execve, так что даже до запуска исполняемого файла в child, один или несколько его файловых дескрипторов по умолчанию будут фактически читать / записывать в именованные файлы.

Когда используется символ "pipe" |, оболочка запускает два дочерних процесса примерно в одно и то же время, но с выходом первого процесса, подключенным ко входу второго процесса. Это включает системный вызов pipe, чтобы создать пару файловых дескрипторов, где запись в один дескриптор просто помещает данные в память операционной системы, пока они не будут считаны из другого дескриптора.

Так, например,

grep 'MAGIC' file1.txt | sort

будет (не обязательно в этом порядке):

  1. Создать пару дескрипторов файла канала
  2. Создайте дочерний процесс для команды grep.
  3. Замените стандартный дескриптор выходного файла дочернего элемента, чтобы использовать конец записи канала.
  4. Начните команду grep с помощью execve.
  5. Создайте дочерний процесс для команды sort.
  6. Замените стандартный дескриптор входного файла дочернего элемента, чтобы использовать конец чтения канала.
  7. Начните команду sort с помощью execve.
  8. Подождите, пока дочерний процесс sort завершится.

В терминах «даже если функция конвейера встроена в систему, должен быть найден фрагмент кода», вы найдете код для интерпретации этих специальных символов оболочки в коде для программы оболочки.

0 голосов
/ 10 сентября 2018

Символы, на которые вы ссылаетесь, операторы оболочки , а не исполняемые файлы (например, двоичные файлы, такие как /bin/ls, он же ) внешние утилиты ).

То есть эти символы указывают оболочке, как координировать выполнение из команд (внешние утилиты, встроенные функции оболочки, функции, псевдонимы) и перенаправлять их ввод / вывод .

  • | является экземпляром оболочки управляющего оператора , который объединяет выполнение нескольких команд в конвейере .

  • < и > - это оболочки операторы перенаправления для перенаправления ввода stdin и вывода stdout соответственно .

Если ваша оболочка bash, обратитесь к man bash или, в более общем смысле, man $SHELL.

0 голосов
/ 10 сентября 2018

Канал не исполняемый файл, но способ иметь межпроцессное взаимодействие конвейерах ). Это важная функция (как и многие другие, включая файлы, каталоги и процессы), предоставляемая ядром Linux . Соответствующий системный вызов - это pipe (2) , а страница pipe (7) дает дополнительные пояснения.

Целая книга (по крайней мере) необходима для ответа на ваш вопрос. Поэтому мы не можем ответить здесь. Но я даю несколько ссылок:

Прочтите какую-нибудь книгу по программированию в Linux, например, старую книгу ALP (которую можно загрузить бесплатно; в ней несколько глав, связанных с вашим вопросом) или что-то более новое. См. Также список системных вызовов (2) .

Тогда прочитайте какую-нибудь книгу об операционных системах. Я рекомендую Операционные системы: Three Easy Pieces (можно загрузить бесплатно; здесь также есть несколько глав, связанных с вашим вопросом).

Так что вам нужно потратить несколько дней или недель на чтение.

Ваша оболочка использует трубу (2) для интерпретации |. Для перенаправлений , таких как > или <, используется dup2 (2) или dup. Конечно, оболочка использует fork (2) для создания процессов, waitpid (2) или аналогичный для их ожидания и execve (2) для запуска программ , Globbing (см. glob (7) ) требует сканирования каталогов с opendir (3) , readdir (3) и т. Д. И запроса метаданных файла с stat (2) ... cd должен быть встроенным в оболочку и использовать chdir (2) .

Так что вам также нужно прочитать больше о оболочках Unix (и хороший способ понять их - написать свою крошечную оболочку на C; это очень распространенное и интересное упражнение).

Кстати, большинство оболочек unix бесплатное программное обеспечение . Вы можете изучить их исходный код. Оболочка sash немного глючит, но она крошечная (и очень простая!) И ее источник вполне читабелен. Конечно, реальные практические оболочки типа bash , zsh , fish имеют гораздо больше функций (большинство из них для удобства), поэтому они более сложны, но вы все равно можете изучите их исходный код, поскольку они являются свободными программами.

0 голосов
/ 10 сентября 2018

Нет файла для | или <. Они реализованы внутри оболочки. То же самое касается if, for, while, etc. Он не может быть реализован как исполняемый файл, потому что | подключает исполняемые файлы, инструктируя оболочку, что она должна делать со своими входами и выходами.

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