Подобные Unix системы "не вызывают функции путем выполнения новых процессов". Они (теперь) совместно использовали библиотеки как в значительной степени все другие относительно современные операционные системы.
Оболочки, с другой стороны, выполняют другие процессы, чтобы сделать определенные задачи. Но не все. У них есть сборка - в функциях, реализованных непосредственно в оболочке (или через общие библиотеки) для наиболее распространенных и простых задач (echo
например, реализован как встроенное большим количеством оболочек).
(Окна cmd
оболочка не отличается от оболочек Unix в этом отношении, BTW.)
Создание процесса в современных подобных Unix системах является, конечно, более дорогим, чем выполнение незавершенного вызова функции, но не таким огромным полем. Ядра оптимизированы для быстрого разветвления, использования методов как копия на записи для управления адресным пространством для ускорения "клонирования" процессов и совместного использования текста (код) страницы динамических библиотек.
Если каждый исполняемый файл на Вашей машине, которую можно было бы назвать из сценария оболочки, был реализован как общая библиотека, также:
Таким образом, Вы, вероятно, не получили бы много для типичного использования, и устойчивость/сложность становится большим количеством проблемы.
Другая вещь состоит в том, что отдельная модель процесса изолирует каждую задачу очень эффективно (принимающий управление виртуальной памятью и защиту). Во "все - библиотека" модель, ошибка в любой служебной библиотеке могла загрязнить (т.е. повреждение) всю оболочку. Ошибка в некоторой случайной утилите могла уничтожить Ваш процесс оболочки полностью.
Дело обстоит не так для мультимодели процесса, оболочка экранируется от того типа ошибки в программах, которые это запускает.
Что-то еще: ниже связь. Когда я смотрю на то, что находится в моем /usr/bin
каталог прямо сейчас, я имею:
... и у меня, вероятно, нет самой необычной системы там. Вы просто не можете смешать первые два типа в том же процессе. Наличие интерпретатора, незавершенного для всех других просто, не практично.
Даже при рассмотрении только "собственного двоичного" формата файла имение интерфейса между "утилитами", являющимися простыми потоками и кодами выхода, делает вещи более простыми.
Единственные требования к утилитам состоят в том, чтобы реализовать ABI операционной системы и системные вызовы. Вы не получаете (почти) зависимости между различными утилитами. Это или чрезвычайно трудно, или невозможная плоскость, для незавершенного интерфейса, если Вы не налагаете вещи как "все, должен быть скомпилирован с версией X компилятора Y, с такой и такие флаги/настройки.
Существуют вещи, для которых незавершенные вызовы действительно делают большую производительность смысла мудрой, и они уже, очень часто, делаются, как создано-ins оболочками. Для остальных отдельная модель процессов работает очень эффективно, и ее гибкость является большим преимуществом.
Я не думаю, зеркально отражая интерфейс USB, самое простое решение Вашей проблемы.
Я не использовал brltty
прежде; но, от того, что я понимаю, необходимо смочь использовать tmux для мультиплексирования терминала за пределами brltty
в целом.
Честно говоря, я действительно не использовал tmux, также; но идя из этого учебного руководства...
tmux -S /tmp/shared
chmod +r /tmp/shared
tmux -S /tmp/shared attach -r
Учебное руководство также дает некоторые предложения о том, как иметь Ваши клиентские терминалы, автоматически подключают к основному терминалу на входе в систему. Тот мог бы или не мог бы иметь значения для Вас; но, если так, Вы могли, вероятно, просто засунуть его в конце клиентской учетной записи .profile
, принятие Вас не имеет никаких проблем безопасности для волнения о.
exec /usr/bin/tmux -S /tmp/shared attach -r
Linux? Если да посмотрите мишень (2) или старое разветвление на выходе.
Но я пошел бы для старого классика
for (dev in devs)
send (dev, command)