Что отвечает за соединение /dev/pts/10 с stdout/stdin/stderr?

BusyBox — это то, что называется двоичным файлом для группового вызова. Это означает, что это один двоичный файл, который имеет несколько служебных функций. Если он вызывается как оболочка, он работает как оболочка, если вызывается как команда ls, он запускает команду ls.

Он заменяет многие стандартные инструменты, используемые в Linux и Unix -, такие как системы с небольшим объемом памяти. Он заменяет функциональность другого программного обеспечения, такого как GNU coreutils, util -linux, iproute и т. д., и его цель обычно состоит в том, чтобы ориентироваться на требования конкретной встроенной системы.

Таким образом, если вы действительно хотите иметь менеджер пакетов утилит... это то, что заменяет busybox и предназначен не быть . Таким образом, вы можете просто использовать набор инструментов, которые заменяет busybox.

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

https://www.busybox.net/FAQ.html#build_system

0
25.01.2020, 22:48
2 ответа

Программа, совместимая с POSIX -, может ожидать наследования файловых дескрипторов #0, #1 и #2 (, также известных программными константами stdin, stdoutи stderr, соответственно )из родительского процесса, в уже -открытом, готовом -к -состоянии использования .

В простейшем случае, когда программа командной строки -в сеансе зарегистрирована на текстовой консоли, без применения перенаправлений, эта цепочка наследования полностью восходит к процессу getty, который инициализировал TTY. устройство для сеанса входа.

При входе в систему с помощью графического интерфейса процесс диспетчера дисплея(gdm/kdm/sddm/lightdm/xdm/<whatever>dm)обычно устанавливает для стандартного ввода и вывода значение /dev/null, а стандартную ошибку — для $HOME/.xsession-errorsили что-то подобное для первого процесса сеанса, и эти файлы дескрипторы также наследуются всеми программами с графическим интерфейсом, запущенными в сеансе, либо как часть среды рабочего стола, либо запущенными с помощью меню или значков рабочего стола.

Например,. SSH, процесс sshd, разветвленный для инициализации сеанса, должен был выделить пару псевдоустройств -TTY, указать файловые дескрипторы stdin/out/errна одну ее половину, а затем exec()изменить оболочку пользователя. Другая сторона этого ответвления будет удерживать другую половину пары псевдо-устройств -TTY и будет обрабатывать шифрование/дешифрование исходящего/входящего трафика между сетью и псевдо-устройством -TTY до тех пор, пока сеанс заканчивается.

Когда эмулятор терминала запускается в сеансе с графическим интерфейсом, он ведет себя по существу так же, как sshdпроцесс при инициализации нового сеанса :он выделяет псевдо -TTY, сам fork()s и один copy устанавливает сеанс, в том числе указывает файловые дескрипторы #0, #1 и #2 на псевдо -TTY и, наконец, exec()на оболочку пользователя,а другая сторона ответвления останется выполнять задачу фактического поддержания визуального представления окна терминала.

Итак, в двух словах, (псевдо? )Устройство TTY было подключено к stdin/stdout/stderr тем, что инициализировало ваш терминальный сеанс, и все процессы, которые могут быть между этим и вашим приложением, просто передавали их по цепочке наследования, ничего не делая вообще к этим файловым дескрипторам, просто позволив им перейти к своему дочернему процессу, как -.

Когда операторы перенаправления используются в командной строке оболочки, так как оболочка fork()является временной копией самой себя при подготовке к фактическому exec()вводу команды, сразу после fork()временная копия закроет соответствующий файловый дескриптор., откройте на его месте вещь, указанную оператором перенаправления, а затем exec()команду, чтобы она унаследовала измененный файловый дескриптор stdin/out/err (s ).


В некоторых системах в стиле Unix -/dev/std*устройства могут обрабатываться оболочкой. Но Linux делает их немного более «настоящими».

В Linux /dev/stdin, /dev/stdoutи /dev/stderr— это просто старые символические ссылки, указывающие на файловую систему /proc:

$ ls -l /dev/std*
lrwxrwxrwx 1 root root 15 Feb  4 08:22 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Feb  4 08:22 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Feb  4 08:22 /dev/stdout -> /proc/self/fd/1

Эти ссылки создаются, когда файловая система /devна основе udevОЗУ -инициализируется при загрузке системы -. Это обычные обычные символические ссылки, ничего волшебного.

Но /proc— это полностью виртуальная файловая система, отражающая состояние процессов в системе в реальном -времени, и поэтому она обладает несколькими «магическими» свойствами:

  • /proc/self— символическая ссылка, указывающая на каталог /proc/<PID>процесса, который ее просматривает:
$ ls -l /proc/self   # the PID of this ls command will be 10839
lrwxrwxrwx 1 root root 0 Feb  4 08:22 /proc/self -> 10839/

$ ls -l /proc/self   # the PID of this ls command will be 10843
lrwxrwxrwx 1 root root 0 Feb  4 08:22 /proc/self -> 10843/
  • /proc/<PID>/fd— это каталог, содержащий символические ссылки, имена которых соответствуют файловым дескрипторам, открытым процессом с помощью <PID>, указывающий на то, что этот файловый дескриптор связан с .

Таким образом, когда процесс в /dev/pts/10пытается получить доступ к /dev/stdin, символическая ссылка вместо этого указывает на /proc/self/fd/0... и когда осуществляется доступ к /proc/self/fd/0, драйвер файловой системы /procпросматривает таблицы процессов, использует ее для поиска таблицы файловых дескрипторов процесса, который обращается к ней, и представляет /proc/self/fd/0как символическую ссылку на /dev/pts/10... именно потому, что этот процесс в настоящее время имеет /dev/pts/10связанный с его файловым дескриптором #0.

В Solaris 11 устройства /dev/std*являются символическими ссылками на каталог /dev/fd/, что также является «волшебным»:

$ uname -sr
SunOS 5.11
$ ls -l /dev/std*
lrwxrwxrwx   1 root     root           0 Jun 17  2019 /dev/stderr ->./fd/2
lrwxrwxrwx   1 root     root           0 Jun 17  2019 /dev/stdin ->./fd/0
lrwxrwxrwx   1 root     root           0 Jun 17  2019 /dev/stdout ->./fd/1

Здесь драйвер файловой системы Solaris /devреализует волшебство, используя узлы устройств в каталоге /dev/fdвместо перенаправления в файловую систему /proc, как это делает Linux по историческим причинам.

2
02.02.2020, 12:52

/dev/pts/10является ведомым концом пары псевдотерминальных устройств . На другом конце находится программа, которая открывала главное устройство-клон /dev/ptmxи получала /dev/pts/10в виде пары (. Каждый раз, когда вы открываете /dev/ptmx, вы получаете другое подчиненное устройство ). Соединение между /dev/ptmxи /dev/pts/10представляет собой двунаправленную трубу с изгибом .

При открытии приложения эмулятора терминала:

  • он открывается /dev/ptmxи получает имя другого конца. Он настраивает другой конец и открывает его,
  • он разветвляется,
  • новый процесс открывает другой конец псевдотерминального устройства и подключает к нему свои stdin , stdout и stderr ,
  • Новый процесс запускает оболочку.

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

Замечание:В системе Linux /dev/stdin, /dev/stdoutи /dev/stderrявляются реальными файлами, которые посредством серии символических ссылок указывают на /proc/<pid>/0, /proc/<pid>/1и /proc/<pid>/2, которые, в свою очередь, укажите на реальное устройство ввода/вывода :в вашем случае /dev/pts/10.

Существование этих трех стандартных потоков гарантируется библиотекой C.

Отредактируйте :, чтобы ответить на ваш обновленный вопрос, давайте уточним некоторые моменты ответа:

  • все, что записывается в /proc/pts/*, считывается терминалом, который его создал и отображает, все, что считывается из /proc/pts/*, поступает с устройства ввода, подключенного к терминалу,
  • в Linux /dev/stdoutчасто является символической ссылкой на /proc/self/fd/1, а /dev/stdin— на /proc/self/fd/0. Виртуальная файловая система /procзаботится о том, чтобы показать каждому приложению /proc/selfкак символическую ссылку на /proc/<pid>, где <pid>— идентификатор процесса приложения.
  • символические ссылки в /proc/<pid>/fdуказывают на файлы, конвейеры и другие материалы, открытые приложением или унаследованные от их родителя. Каждое приложение гарантированно имеет три файловых дескриптора, открытых:0для чтения ввода, 1для записи вывода, 2для записи ошибок. В вашем случае это /dev/pts/10.

Если вы не перенаправляете вывод в другой файл, каждая команда, запускаемая оболочкой, записывается в терминал. Исключением из этого правила является ситуация, когда группа процессов вашей команды отличается от группы процессов переднего плана терминала,то запись завершится ошибкой и команде будет отправлено SIGTTOU. Этим поведением можно управлять с помощью stty tostopи stty -tostop:

.
stty tostop
echo "/dev/stdout points to the terminal, but I won't print anything" &
stty -tostop
echo "You can see me" &
5
28.01.2020, 02:29

Теги

Похожие вопросы