LINUX.ORG.RU
ФорумTalks

[post UNIX?] [когда будет?] Универсальный интерфейс-конструктор


0

1

Чисто текстовые интерфейсы, построенные на основе принципов UNIX известны уже давно и до сих пор являются самыми удобными из существующих в активном использовании на настоящий момент.

Удобство этих инструментов вытекает из возможности лёгкого объединения функциональности нескольких программ с помощью пайпов, позволяя создавать лёгкие небольшие программы, которые вместе могут делать сложные вещи.

Однако, классические интерфейсы UNIX неидеальны по нескольким причинам:

1) Ограниченное число стандартных потоков. Только stdin, stdout и stderr и всё.

2) В пайп можно перенаправлять только stdout, хотя ещё есть |& который перенаправляет и stdout и stderr, но в bash, по крайней мере, я не нашел оператора, что бы перенаправить только stderr.

3) Потоки по традиции завязаны на plain-text, хотя сейчас компьютеры часто обрабатывают аудио, видео и прочие данные. Хотя эти данные можно передавать по одному пайпу, однако см. (1) и (2)

А ведь у программы может быть больше потоков ввода и вывода, чем один.
Скажем, есть программы (в скобках условные названия):
* парсер файлов-контейнеров, который расщепляет файл типа ogg на видео-поток, аудио-поток, поток субтитров, поток тегов (media-split);
* программа, которая декодирует аудио-поток (vorbis-decode),
* программа, которая декодирует видео-поток (theora-decode),
* программа, которая трансформирует субтитры в видео-поток (sub-player),
* программа, которая накладывает несколько видео-потоков, используя полупрозрачность (video-mixer),
* программа, которая выводит видеопоток на дисплей (video-display)
* программа, отображающая текст (text-display)
* программа, ловящая нажатия клавиатуры и преобразующая их в команды для управления другими программам (key-hook)
* и наконец, программы для наложения всяких аудио и видео эффектов (audio-effect)

На настоящий момент, для всех этих функций можно использовать одну команду — например mplayer, однако что если будет нужен какой-то хитрый эффект, которого mplayer не умеет, или там субтитры будут в каком-то формате, которого он не знает? Можно конечно, и обходной манёвр придумать, например субтитры преобразовать в нужный формат до начала воспроизведения видео, эффекты тоже наложить до него.
А вот если бы был более гибкий способ соединения разных программ, то можно было из того что перечислено выше прямо на ходу написать команду, которая будет воспроизводить видеофайл с субтитрами, наложением эффектов на звук и видео, и управлением сочетаниями клавиш, которая к тому же будет показывать перед началом каждого видеофайла информацию о нём, которую ты хочешь. А при желании, одновременно с показом, ещё и записывать в новый видеофайл (только тогда надо будет добавить ещё несколько команд). А вот как это сделать с помощью обычных юниксовых пайпов я с трудом представляю.

Кроме того, не смотря на удобство концепции юникс, она всё-таки удобна не для всего. Графический интерфейс используется даже самыми отъявленными консольщиками...

Так вот, какие есть варианты пост-юниксового модульного интерфейса, который бы позволял безкостыльно расширить принципы юникс на графику, звук, видео..., сочетая всё полезное от текстового и графического интерфейса?

★★★★★

Последнее исправление: Xenius (всего исправлений: 1)
Ответ на: комментарий от nu11

find /var /dev -type s , и не задавай больше глупых вопросов.

geekless ★★
()
Ответ на: комментарий от nu11

Мог бы просто сказать, что я пытаюсь добиться решения совсем другой задачи.

И да, квотирование предотвращает множество непоняток.

baverman ★★★
()
Ответ на: комментарий от nu11

> на то они и стандартные. Никто не мешает открывать больше
И как их открывать, не создавая предварительно лишних fifo-файлов?

на то они и стандартные. Никто не мешает открывать больше

2> есть, а где 2| или что-то подобное? Как оно пишется?

Xenius ★★★★★
() автор топика
Ответ на: комментарий от kermzyxer

>Как раз наоборот. Если софт работает в годной ВМ, то можно делать очень гибкие политики безопасности. А еще не тратится время на переключение контекста.
Никакой разницы не будет, проверку по политике безопасности придется проводить при каждом обращении к памяти, это затраты на уровне переключения контекста. Причем меморилики в данном случае не починишь простым убиванием процесса.

Если ты про одно адресное пространство, то проблем быть не должно: памятью должна управлять ВМ.

Проблема в данном случае не в том, чтобы разделить саму память, а в том, чтобы еще и именна переменных были известны, которые на эту память указывают, они ведь нигде не хранятся. А это уже нетривиальная задача, тем более может быть запущенно более 1 экземпляра программы.

Tark ★★
()
Ответ на: комментарий от baverman

>> То есть он имеет в виду, что никак не получится без использования именованных пайпов перенаправить 1 поток в одну программу, а 2 в другую.

А что, за использование именованных пайпов по рукам бьют?


Это костыли, потому что при их использовании, приходится их предварительно создавать. Впрочем, можно было бы сделать виртуальную файловую систему типа /dev/fifo/ при попытке записи в которую автоматом создавался пайп

Xenius ★★★★★
() автор топика
Ответ на: комментарий от Quasar

> Plan9 и Libmo - всё уже сделано.
Ну я знаю, что это пост-юникс, но там вроде был упор на сетевую прозрачность, а не на множество потоков.

Xenius ★★★★★
() автор топика
Ответ на: комментарий от Tark

> Никакой разницы не будет, проверку по политике безопасности придется проводить при каждом обращении к памяти, это затраты на уровне переключения контекста.
Да там вообще много каких затрат будет. За все приходится платить. ;)
И, кстати, проверки будут точно не при *каждом* обращении к памяти.
Пример:
1) Приложению нужно получить доступ к полю объекта.
2) Оно делает запрос ВМ.
3) ВМ решает, разрешить ли доступ к участку памяти, занимаемому полем. (проверка одна)
4) Если да, то возвращает ссылку на поле.

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

Ну, это уже детали. К тому же, еще и не правда. В Лиспе хранятся, например, имена символов.

kermzyxer
()
Ответ на: комментарий от baverman

>Мог бы просто сказать, что я пытаюсь добиться решения совсем другой задачи.

я отвечал топикстартеру. Потом отвечал ярегу с его альтернативным видением задачи. Потом пришел ты и начал жестко тупить :)

nu11 ★★★★★
()
Ответ на: комментарий от Xenius

>> на то они и стандартные. Никто не мешает открывать больше

И как их открывать, не создавая предварительно лишних fifo-файлов?


man 2 pipe :)

А вообще, реальную задачу в студию.

nu11 ★★★★★
()
Ответ на: комментарий от kermzyxer

>1) Приложению нужно получить доступ к полю объекта.

2) Оно делает запрос ВМ.

3) ВМ решает, разрешить ли доступ к участку памяти, занимаемому полем. >(проверка одна)


4) Если да, то возвращает ссылку на поле.


Но приложение может ведь и нелегальным путем получить ссылку на поле, как это регулировать? Сейчас ведь одна из популярнейших атак - «переполнение буфера» используется для того, чтобы получить доступ к памяти в которой расположены функции, а тут оно на тарелочке будет?

Ну, это уже детали. К тому же, еще и не правда. В Лиспе хранятся, например, имена символов.

Есть 10 экземпляров nginx, как различать различные имена переменных? Что делать, когда второй экземпляр nginx упадет и запустится 11-ый?

Tark ★★
()
Ответ на: комментарий от ChALkeR

Или ты что-то не то имел ввиду?

Именно. что-то вроде

stdout   __ prog2 | prog4 _
        /                  \___stdin_
prog1                       __stdctrl_\ prog6
        \__ prog3 | prog5 _/
stderr

То есть stdout от программы 1 перенаправляется на один конвейер, stderr на другой, они обрабатываются, а потом обработанный stderr управляет командой prog6, а обработанный вывод команды 1 подаётся на её вход.

Xenius ★★★★★
() автор топика
Ответ на: комментарий от Tark

> Сейчас ведь одна из популярнейших атак - «переполнение буфера» используется для того, чтобы получить доступ к памяти в которой расположены функции, а тут оно на тарелочке будет?
Напротив, в теории переполнение буфера будет невозможно т.к. выделением памяти управляет ВМ.

Но приложение может ведь и нелегальным путем получить ссылку на поле, как это регулировать?

Из-за критической уязвимости - да...

Есть 10 экземпляров nginx, как различать различные имена переменных? Что делать, когда второй экземпляр nginx упадет и запустится 11-ый?

Не уверен, что понял вопрос... Но он в любом случае преждевременный. И не думаю, что встанет проблема «как же разделять имена переменных» =)

kermzyxer
()
Ответ на: комментарий от DonkeyHot

> А какие ещё ты можешь придумать _стандартные_(т.е. присущие всем программам) потоки?
Например stdctrl, стандартный поток управления.
Сейчас в программах обычно вместо него stdin используют, а если нужно что-то обрабатывать, то внешний файл со скриптами или параметр командной строки.

А вот как по-твоему сделать что бы sed управлялся одним конвейером, формирующим что-нибудь вроде «s/foo/bar», а ввод данных получал от другого?

Xenius ★★★★★
() автор топика
Ответ на: комментарий от kermzyxer

>Из-за критической уязвимости - да...
Ну допустим злоумышленник берет маленькую программу, которая просто зануляет всю память. Ей ведь не нужны ссылки, чтобы занулить всю память.

Не уверен, что понял вопрос... Но он в любом случае преждевременный. И не думаю, что встанет проблема «как же разделять имена переменных»

Почему? Данные можно в общую память класть уже 100 лет в обед, man shmem. Только вот как определить что это за память, где она, какого типа объект там находится и как вообще к нему обращаться - весьма не тривиально.

Tark ★★
()
Ответ на: комментарий от Xenius

Хотя в случае с sed можно юзать ``, но что если взять вместо медиаплеер, и одна из программ например cat /dev/keyboard | sed 's/ /pause/', упавляет им, а другая — например curl http://site.org/mediafile.ogg даёт входной поток?

Xenius ★★★★★
() автор топика
Ответ на: комментарий от Tark

> Ну допустим злоумышленник берет маленькую программу, которая просто зануляет всю память. Ей ведь не нужны ссылки, чтобы занулить всю память.
Мне кажется, ты таки не понимаешь, что такое автоматическое управление памятью. ;)
Программы в принципе не могут работать с памятью напрямую. Этим занимается компилятор при компиляции и ВМ в рантайме.

Только вот как определить что это за память, где она, какого типа объект там находится и как вообще к нему обращаться - весьма не тривиально.

Опять же. Я и не говорил о низкоуровневом доступе к памяти. А указатели на объекты никто не отменял!

kermzyxer
()
Ответ на: комментарий от kermzyxer

>Программы в принципе не могут работать с памятью напрямую. Этим занимается компилятор при компиляции и ВМ в рантайме.
Я не понимаю. VM возвращает ссылку на поле. Что мешает манипулировать этой ссылкой? Вы же сами говорите, что проверка не будет вызываться каждый раз.

А указатели на объекты никто не отменял!

А описание типа объекта из хаскеля в лисп передавать электронной почтой будете?

Tark ★★
()
Ответ на: комментарий от Tark

> Что мешает манипулировать этой ссылкой?
Да ничего не мешает, наверное. Ссылка - она и есть ссылка.

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

Не совсем так: «проверки будут точно не при *каждом* обращении к памяти». Не в ущерб безопасности, конечно.

А описание типа объекта из хаскеля в лисп передавать электронной почтой будете?

Ну, это просто будут разные типы, например... Аналогия: JVM и ее друзья-ЯП.

kermzyxer
()
Ответ на: комментарий от Xenius

>стандартный поток управления

Трудно представить, для чего, скажем, sed-у отвязанный от stdin-а поток управления. Программа будет генерировать разный результат в зависимости от уровня паралельности системы. Т.ч. IMО идея хороша только на первый взгляд.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

> для чего, скажем, sed-у отвязанный от stdin-а поток управления.

Ну sed-у может быть и не нужно, а вот например mplayer-у вполне нужно, и там даже есть возможность его юзать. Но это не стандартный поток, а задаваемый в конфиге файл.

Xenius ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.